入门P120
二进制法:
理解:
对于给定的一个整数n求其集合{0,1,2,3.....n-1}的子集
显然,n个元素有2^n个子集(含空集)
全集为2^n-1(n个1)
用1表示存在0表示不存在(看p120)
2^n个子集用二进制表示有2^n总方式
从000000.....0到11111.......1;
每个都是不同的都对应一个子集;
于是对于一个给定的二进制表达0000110........;
必须通过方法将其中的1凸现出来;
此时最简单的方法就是用1的二进制表达法00000000....000001;
通过不断的移位和与运算凸显出二进制中的1并且输出
for(int i = 0;i<n;++i)
{
if(s&(1<<i))
printf("%d ",i);
}
这段代码就是这个意思;
"i<(1<<n)"全集大小为2^n-1 =1<<n -1
#include <stdio.h>
#include <math.h>
#include <algorithm>
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)
print_subset(n,i);
return 0;
}