您的位置:首页 > 其它

子集生成

2015-02-14 16:23 106 查看
第一种方法:增量构造法,一次选出一个元素放到集合中,程序如下:

#include<cstdio>
#include<cstring>
#include<cstdlib>

void print_subset(int n,int *A,int cur)
{
for(int i = 0; i <cur; i++) printf("%d ",A[i]);
printf("\n");
int s = cur ? A[cur-1]+1 : 0;
for(int i = s; i < n; i++)
{
A[cur] = i;
print_subset(n,A,cur+1);
}
}

int main()
{
int A[100];
int n;
scanf("%d",&n);
print_subset(n,A,0);
return 0;
}
第二种方法:位向量法,构造一个位向量B[i],而不是直接构造子集A本身,其中B[i]=1当且仅当i在子集A中。

#include<cstdio>
#include<cstring>
#include<cstdlib>

void print_subset(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_subset(n,B,cur+1);
B[cur] = 0;
print_subset(n,B,cur+1);
}

int main()
{
int A[100],B[100];
int n;
scanf("%d",&n);
print_subset(n,B,0);
return 0;
}


第三种方法:二进制法

#include<cstdio>
#include<cstring>
#include<cstdlib>

void print_subset(int n,int s)
{
for(int i = 0; i < n; i++)
if(s&(1<<i)) printf("%d ",i);
printf("\n");
}

int main()
{
int n;
scanf("%d",&n);
for(int i = 0; i < (1<<n); i++)
print_subset(n,i);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: