表达方式
将一个集合{0,1,2,3,……,n-1}的子集s用二进制编码可以编码为如下整数
f(s)=∑i∈s2i
在这种编码下,我们就可以用位运算来表示集合的一些运算,具体例子如下:
空集 ∅ : 0;
只含有第i个元素的子集 {i} : 1<<i ;
含有全部n个元素的集合 {0,1,2,…….,n-1}: (1<<n)−1 ;
判断第i个元素是否属于集合s:if( s>>i&1);
向集合中加入第i个元素: s|1<<i ;
从集合中去除第i个元素: s&~(1<<i);
集合s和t的并集 : s | t;
集合s和t的交集 : s&t;
代码实现
下面介绍几种枚举集合的方法,//*的内容表示自己的处理
1.枚举所有子集
for(int s=0;s<(1<<n);s++){
//*
}
2.枚举某个集合子集
int sub=sup;
do{
//*
sub=(sub-1)⊃
}while(sub!=sup);
int comb=(1<<k)-1;
3.枚举所有集合大小为k的子集
int comb=(1<<k)-1;
while(comb<(1<<n)){
//*
int x=comb&-comb,y=comb+x;
comb=((comb&-y)/(x>>1))|y;
}