描述:求解集合{0,1,2,........,n-1}的子集;
思路:利用二进制思想,如果在集合中某位数存在,那么对应的二进制的相应位数即为1。
比如,集合{1,4,5,7}对应的二进制表示为:10110010(从右往左数),因此如果我们确定了一个二进制序列,对应的也就确定了一个集合。此外,集合的运算可以利用&,|,^,运算符,依次等价于集合的交集,并集和对称差集。
实质:将子集的每一种排列对应一个二进制数而已,然后选择集合的那个数就在二进制的对应位的数置1.
看代码吧:
#include<iostream>
#include<algorithm>
#define INF 100000000;
using namespace std;
void print_subset(int n,int s){//打印子集
for(int i = 0;i < n;i++)
if(s&(1<<i)) printf("%d ",i);//非零打印
printf("\n");
}
int main() {
int n;
scanf("%d",&n);
for(int i = 0;i < (1<<n);i++)//枚举各子集对应的编号0,1,2,.....,2^n -1
print_subset(n,i);
return 0;
}
思考:注意体会这种思想。。。