7.31 增量构造法
void print_subset1(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; //当第一次调用,cur为0,s赋值0
for(i = s;i < n;i++)
{
A[cur] = i; //加入一个数
print_subset1(n,A,cur+1);
}
}
增量构造法,顾名思义,每次添加一个元素,然后输出.
7.32 位向量法
void print_subset2(int n,int *B,int cur)
{
if(cur == n) //当B[0]到B[n-1]全部赋值完毕,输出
{
for(int i = 0;i < n;i++)
if(B[i]) printf("%d ",i); //B[i]为1或0
printf("\n");
return;
}
else
{
B[cur] = 0; //加入第cur个元素
print_subset2(n,B,cur+1);
B[cur] = 1; //不加入第cur个元素
print_subset2(n,B,cur+1);
}
}
B[i]表征i是否加入集合,当数组B[n-1]全部赋值完毕,输出集合.
7.33二进制法
同7.32,不过使用二进制来表示子集,类似于离散数学的真值表.
void print_subset3(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;
}