求解集合的子集

描述:求解集合{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;
}

思考:注意体会这种思想。。。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值