子集生成

Posted ygeloutingyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子集生成相关的知识,希望对你有一定的参考价值。

输入n,由n得到集合D{1~n},输出集合D的所有子集;

方法1:增量构造法(依次往集合中增加一个元素)

代码:

#include <bits/stdc++.h>
#define ll long long
#define MAXN 100+10
using namespace std;

int a[MAXN];

void print_subset(int n, int* a, int cur)
{
    for(int i=0; i<cur; i++)   // 输出当前集合
    cout << a[i] << " ";
    cout << endl;
    int s = cur ? a[cur-1] + 1 : 1;  // 集合按字典序输出,确定当前元素的最小可能值(避免输出{2,1},{1,2})这样的情况
    for(int i=s; i<=n; i++)
    {
        a[cur]=i;
        print_subset(n, a, cur+1);   // 按层次递归构造子集
    }
}

int main(void)
{
    int n;
    cin >> n;
    print_subset(n, a, 0);
    return 0;
}

方法2:位向量法(dfs)

代码:

#include <bits/stdc++.h>
#define ll long long
#define MAXN 100+10
using namespace std;

int a[MAXN]={0};

void print_subset(int n, int* a, int cur)
{
    if(cur==n+1)            // 当n(n+1-1)个元素全部递归完后打印当前集合
    {
        for(int i=1; i<=cur; i++)
        if(a[i]) cout << i << " ";
        cout << endl;
        return;
    }
    a[cur]=1;              // 选第cur个元素
    print_subset(n, a, cur+1);
    a[cur]=0;             // 不选第cur个元素
    print_subset(n, a, cur+1);
}

int main(void)
{
    int n;
    cin >> n;
    print_subset(n, a, 1);
    return 0;
}

以上是关于子集生成的主要内容,如果未能解决你的问题,请参考以下文章

子集生成

如何生成集合的所有唯一子集?

子集生成方法

构建覆盖特定顶点子集的最小生成树

生成子集集和未使用的元素

搜索-子集生成