状压 dp

套路

统计 1 的个数

int count(unsigned x)
{
    int ret;
    for (ret = 0 ; x ; x &= (x - 1)) ret++;
    return ret;
}
1
2
3
4
5
6

枚举状态 s 的非空子集

for (unsigned t = s ; t ; t = (t - 1) & s)
{
    /* do something on t */
}
1
2
3
4

枚举状态 f 减去状态 s 的集合的每一位

假设全集状态为 u,且 sf 的一个子集.

for (unsigned t = (f ^ s) & u ; t ; t &= (t - 1))
{
    unsigned bit = t & -t;
    /* do something on bit */
}
1
2
3
4
5
Last Updated: 8/18/2018, 2:32:44 PM