增量构造法(0~n-1子集)
思路:一次选出一个元素放入集合中,程序如下:
#include<cstdio>
#include<iostream>
using namespace std;
intA[10];// A数组的下角标分别表示 (0~n-1)集合
voidprint_subset(int n,int* A,int cur)
{
//cur :当前位置
for(int i=0;i<cur;i++)//打印当前元素
{
cout<<A[i]<<" ";
}
cout<<endl;
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 n;
cin>>n;
print_subset(n,A,0);
return 0;
}
以n=2为例,有些时候自己遇到不懂的,数形结合,把自己当作计算机把程序运行一遍,问题就迎刃而解了。