子集生成
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;
}
以上是关于子集生成的主要内容,如果未能解决你的问题,请参考以下文章