首页 > 代码库 > 全组合

全组合

输入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;}

  

全组合