感谢刘大大;
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
void print_subset(int n,int s){
for(int i=0;i<n;i++)
if(s&(1<<i)) printf("%d",i);
cout<<endl;
}
int main(){
int s[4]={0,1,2,3};
for(int i=0;i<(1<<4);i++)
print_subset(4,i);
return 0;
}
我要解释一下:
所谓用二进制表示数就是用二进制的每一个数位表示一个数,当然 1 表示有一个数 0表示没有。
比如 一个二进制数 01111,我们可以用来表示一个集合p[4]={0,1,2,3},从右到左一次是0,1,2,3,4.
转化为10进制就是2的n次方-1;
对于主函数中的for循环中(1<<4),我开始在想为什么不是直接i<4就好,4个数4个循环嘛。发现不是这样的,
这样做只是把00000,00001,00010,00011,00100,忘了先决条件,用0,1代表是否含有这数字。最重要的一点就是
01111仅仅是代表这个集合最大的子集罢了。
然后就是subset函数了,这里面的操作是把二进制转化为十进制的数字。(真的,算法真的好奇妙啊!)