增量构造法(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为例,有些时候自己遇到不懂的,数形结合,把自己当作计算机把程序运行一遍,问题就迎刃而解了。

算法竞赛-7.3.1增量构造法










相关文章: