标签:
输入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;
}
标签:
原文地址:http://www.cnblogs.com/geloutingyu/p/5838828.html