状态压缩DP
常见运算
//集合A、B,元素c --> int A,B c = 0 ~ 31
//A中插入c
A |= (1<<c)
//A中去除c
A &= ~(1<<c)
A ^= (1<<c)
//A B 合并
A | B
//判断B是不是A的子集
return (A&B) == B
//判断c在不在A里
return A & (1<<c)
//lowbit
return x & (-x);
//枚举A的全部子集
for(int i = A; i; i = (i-1) & A)
{
//do something
}
// 将一个数的最低位到最高位(最高位为从高到低第一个1)全部置1
int num = 0b10110;
int mask = 0;
while (mask < num)
{
mask = (mask << 1) + 1;
}