幂集

缘起

高一数学讲集合的时候就指出

n个元素构成的集合幂集有 2^n 个

现在的需求是将这2^n个幂集枚举出来.

一共n个元素, 每个元素有取与不取之分. 这就是典型的深搜.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
#include <iostream>
#pragma warning(disable:4996) // 防止scanf 等不带_s的api报错

#define LOCAL
using namespace std;

const int MAX_N = 20;

int n,cnt; // n是表示我们求的是 [1,...,n]的幂集,而cnt 表示是第几个幂集
bool choice[MAX_N];

void powerset(int i) // i表示决定i是否要选取
{
if (i==n+1)
{
printf("第%d个幂集是:{", ++cnt);
for (int j = 1; j <= n; j++)
{
if (choice[j])
{
cout << j;
}
}
puts("}\n");
return;
}
choice[i] = false; // 不选i
powerset(i+1);
choice[i] = true; // 选i
powerset(i+1);
}

int main()
{
#ifdef LOCAL
freopen("d:\\data.in", "r", stdin);
scanf("%d", &n);
cout << "一共" << pow(2.0, n) << "个幂集" << endl;
powerset(1);
#endif
return 0;
}