输入n个数,求这n个数构成的集合的所有自己
3
1 2 3
输出
1
1 2
1 2 3
1 3
2
2 3
3
代码:
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int maxn = 100; 5 6 int n,m; 7 int rcd[maxn],num[maxn],vis[maxn]; 8 9 int read_input(){ 10 11 if(scanf("%d",&n)==EOF) 12 return 0; 13 for(int i=0;i<n;i++) 14 scanf("%d",&num[i]); 15 return 1; 16 } 17 18 void full_combination(int l,int p){ 19 20 for(int i=0;i<l;i++){ 21 printf("%d",rcd[i]); 22 if(i<m-1) 23 printf(" "); 24 } 25 printf(" "); 26 27 28 for(int i=p;i<n;i++){ 29 rcd[l]=num[i]; 30 full_combination(l+1,i+1); 31 32 } 33 } 34 int main() { 35 while(read_input()){ 36 37 full_combination(0,0); 38 39 } 40 41 return 0; 42 }
用向量表示
1 #include<cstdio> 2 #include<string.h> 3 using namespace std; 4 const int MAXN = 1000; 5 int vis[MAXN],num[MAXN],rcd[MAXN]; 6 int n; 7 int input(){ 8 if(scanf("%d",&n)!=1) 9 return 0; 10 for(int i=0;i<n;i++) 11 scanf("%d",&num[i]); 12 memset(vis,0,sizeof(vis)); 13 return 1; 14 } 15 void print_subset(int p){ 16 if(p==n){ 17 for(int i=0;i<p;i++) 18 if(vis[i]) 19 printf("%d ",num[i]); 20 printf(" "); 21 return ; 22 } 23 24 vis[p]=1; 25 print_subset(p+1); 26 vis[p]=0; 27 print_subset(p+1); 28 29 30 } 31 int main(){ 32 while(input()) 33 print_subset(0); 34 return 0; 35 }
用位运算表示
1 #include<cstdio> 2 #include<string.h> 3 using namespace std; 4 const int maxn =100 ; 5 int num[maxn]; 6 7 void print_subset(int n,int s){ 8 for(int i=0;i<n;i++) 9 if(s&(1<<i)) 10 printf("%d ",num[i]); 11 printf(" "); 12 } 13 int main(){ 14 int n; 15 while(scanf("%d",&n)==1) 16 { 17 for(int i=0;i<n;i++) 18 scanf("%d",&num[i]); 19 for(int i=0;i<(1<<n);i++) 20 print_subset(n,i); 21 } 22 return 0; 23 }