全组合

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

}

  

你可能感兴趣的:(组合)