一些不大的数的集合,可以用二进制的形式来表示,注意这里的集合没有重复元素。
集合的存储
方法是用一串二进制的数存,第i位表示i这个数是否在集合中。设集合中最大的数不超过(1<<n),令s=1<<n,假如i在集合中,让s=s|(1<<i),就将i存在了s中。
集合的运算
因为是二进制表示,A|B、A&B、A^B、分别对应集合的并,交和对称差。
子集 元素的输出
从1到n枚举,如果在s中就输出,代码:
void print_element(int n,int s){
for(int i=0;i<n;i++)
if(s&(1<<i)) printf("%d ",i);
printf("\n");
}
输出s的子集
for(int s0=s;s0;s0=(s0-1)&s)
print_element(n,s0);
那么,如何输出包含0到n-1的集合的子集呢?
各个元素分别对应不同位上的1,所以从0到(1<<n)枚举各个数,分别对应不同的结合组合,满足条件的打印出来。
for(int i=0;i<(1<<n);i++){
print_element(n,i);
}
转载请注明出处。