首页 > 代码库 > 子集生成

子集生成

输入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;
}

子集生成