标签:
输入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("\n");
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("\n");
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("\n");
}
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;
}
标签:
原文地址:http://www.cnblogs.com/huicpc0212/p/4185980.html