子集生成

位向量法:

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define maxn 1005
 4 using namespace std;
 5 int n;
 6 int B[maxn];
 7 void print_subset(int n,int B[],int cur)
 8 {
 9     if(cur==n+1)
10     {
11         for(int i=0;i<cur;i++)
12         if(B[i])printf("%d ",i);
13         printf("
");
14         return;
15     }
16     B[cur]=1;//选第cur个元素
17     print_subset(n,B,cur+1);
18     B[cur]=0;//不选第cur个元素
19     print_subset(n,B,cur+1);
20 }
21 int main()
22 {
23     scanf("%d",&n);
24     print_subset(n,B,1);
25     return 0;
26 }

二进制法:

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define maxn 1005
 4 using namespace std;
 5 int n;
 6 void print_subset(int n,int s)
 7 {
 8     for(int i=0;i<n;i++)//这里注意,i从0开始取,2^0=1,最大取到n-1,代表最大可以在n-1上取1。
 9         if(s&(1<<i))printf("%d ",i);//按位取,如果是1则输出
10     printf("
");
11 }
12 int main()
13 {
14     scanf("%d",&n);
15     for(int i=1;i<=(1<<n);i++)//生成1~2^n种不同的可能
16     {
17         print_subset(n,i);
18     }
19     return 0;
20 }