问题描述:给定一个集合,求其所有子集。

解法思路:一个长度为n的集合,共有2^n个子集,每一种可能都用二进制表示,相应的二进制数的0和1对应相应的元素不存在/存在,问题解决。

C++实现:

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
#include<iostream>
#include "math.h"

using namespace std;

//用二进制表示元素的存在/不存在
void findSubset(int r[], int n) {

//子集个数
int p = (int) pow(2 ,n);
//元素下标
int i = 0;
while(p != 0) {
int j = p;
//该种情况下的集合
while(j != 0) {
int m = j % 2;
//余数为1存在
if(m == 1) {
if(i < n) {
cout << r[i] << " ";
} else {
//数组越界只有一种情况就是,该集合为空集的时候
cout << "空集 ";
}
}
i ++;
j = j / 2;
}
p--;
i = 0;
cout << "\n----------" << endl;
}
}

int main () {
int a[3] = {3,1,8};
findSubset(a, 3);

return 0;
}