输入n个数,求这n个数构成的集合的所有自己
3
1 2 3
输出
1
1 2
1 2 3
1 3
2
2 3
3
#include<cstdio> #include<cstring> using namespace std; const int maxn = 100; int n,m; int rcd[maxn],num[maxn],vis[maxn]; int read_input(){ if(scanf("%d",&n)==EOF) return 0; for(int i=0;i<n;i++) scanf("%d",&num[i]); return 1; } void full_combination(int l,int p){ for(int i=0;i<l;i++){ printf("%d",rcd[i]); if(i<m-1) printf(" "); } printf(" "); for(int i=p;i<n;i++){ rcd[l]=num[i]; full_combination(l+1,i+1); } } int main() { while(read_input()){ full_combination(0,0); } return 0; }
用向量表示
#include<cstdio> #include<string.h> using namespace std; const int MAXN = 1000; int vis[MAXN],num[MAXN],rcd[MAXN]; int n; int input(){ if(scanf("%d",&n)!=1) return 0; for(int i=0;i<n;i++) scanf("%d",&num[i]); memset(vis,0,sizeof(vis)); return 1; } void print_subset(int p){ if(p==n){ for(int i=0;i<p;i++) if(vis[i]) printf("%d ",num[i]); printf(" "); return ; } vis[p]=1; print_subset(p+1); vis[p]=0; print_subset(p+1); } int main(){ while(input()) print_subset(0); return 0; }
用位运算表示
#include<cstdio> #include<string.h> using namespace std; const int maxn =100 ; int num[maxn]; void print_subset(int n,int s){ for(int i=0;i<n;i++) if(s&(1<<i)) printf("%d ",num[i]); printf(" "); } int main(){ int n; while(scanf("%d",&n)==1) { for(int i=0;i<n;i++) scanf("%d",&num[i]); for(int i=0;i<(1<<n);i++) print_subset(n,i); } return 0; }