【模板】二进制状态压缩
C++版本:
集合操作
空集∅ ——————————————————0
只含第i个元素的集合{ i } —————————1 << i
含有全部n个元素的集合{0,1…,n-1}———— ( 1 << n ) - 1
判断第i个元素是否属于集合S———————if ( S >> i & 1 )
向集合中加入第i个元素S∪{ i }—————— S | 1 << i
从集合中去除第i个元素S{ i } —————— S &~ ( 1<< i )
集合S和T的并集S∪T————————— S | T
集合S和T的交集S∩T—————————— S&T
将集合{0,1…,n-1}的所有子集枚举:
for (int S = 0; S < 1 << n; S++) {
//对集合的操作
}
枚举某个集合sup的子集:
int sub = sup;
do {
//对子集的处理
sub = (sub - 1)⊃
} while (sub != sup)
枚举{0,1…,n-1}所包含的所有大小为k的子集:
int comb = (1 << k) - 1;
while (comb < 1 << n) {
//进行针对组合的处理
int x = comb & -comb, y = comb + x;
comb = ((comb&~y) / x >> 1) | y;
}
统计二进制中1的个数
int getsum(int S) {
int ans = 0;
while (S) { if (S & 1)ans++; S >>= 1; }
return ans;
}