子集生成(三种方法)

来源:互联网 发布:易吧进销存软件下载 编辑:程序博客网 时间:2024/05/16 03:30
#include <iostream>#include <cstdio>#include <cmath>#include <stdlib.h>using namespace std;void print_subset1(int n,int *A,int cur)              //增量构造法{    for(int i=0;i<cur;i++) printf("%d",A[i]);    if(cur!=0) printf("\n");    int s=cur?A[cur-1]+1:0;    for(int i=s;i<n;i++)    {        A[cur]=i;        print_subset1(n,A,cur+1);    }}void print_subset2(int n,int *B,int cur)             //位向量法{    if(cur==n)    {        for(int i=0;i<cur;i++)            if(B[i]) printf("%d",i);        printf("\n");        return;    }    B[cur]=1;    print_subset2(n,B,cur+1);    B[cur]=0;    print_subset2(n,B,cur+1);}void print_subset3(int n)                                //二进制法{    for(int i=1;i<(1<<n);i++)    {            for(int j=0;j<n;j++)            if(i&(1<<j)) printf("%d",j);            printf("\n");    }}int main(){      int a[10],n;      while(scanf("%d",&n)!=EOF)      {          system("cls");          printf("增量构造法:\n");print_subset1(n,a,0);          printf("位向量法:\n"); print_subset2(n,a,0);          printf("二进制法:\n");print_subset3(n);      }    return 0;}