第一种方法:增量构造法,一次选出一个元素放到集合中,程序如下:
#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;
}