您的位置:首页 > 其它

子集生成(三种方法)

2013-08-11 16:43 246 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: