状压 dp
套路
1
的个数
统计 int count(unsigned x)
{
int ret;
for (ret = 0 ; x ; x &= (x - 1)) ret++;
return ret;
}
1
2
3
4
5
6
2
3
4
5
6
s
的非空子集
枚举状态 for (unsigned t = s ; t ; t = (t - 1) & s)
{
/* do something on t */
}
1
2
3
4
2
3
4
f
减去状态 s
的集合的每一位
枚举状态 假设全集状态为 u
,且 s
是 f
的一个子集.
for (unsigned t = (f ^ s) & u ; t ; t &= (t - 1))
{
unsigned bit = t & -t;
/* do something on bit */
}
1
2
3
4
5
2
3
4
5