子集生成
位向量法:
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("\n"); 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("\n"); 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 }