定义:
对于任何一个集合B,只要A 包含于 B 那么A即是B的子集,每个集合子集个数为2^n个(n为集合中元素的个数)
考虑数2^n,它的第n位是1(第一位是第0位).它总共包含2^n 个数字。
n=0 2^n=1 空集
n=1 2^1=2 空集+只有一个元素的集合
假设以下n=2
n=2 | 总共有4个元素 |
集合元素个数 | 位表示法 |
0 | 0 |
1 |
01 和 10 |
2 | 11 |
由此有,我们需要枚举2^n次,每次检查生成数字的位数是否为1,如果有1的,说明应该取对应的元素。代码如下。
void subset(int n,int * a) { for (int i = 0;i < (1 << n);i++) { for (int j=0;j < i; j++) { if (i&(1<<j)) { std::cout << a[j]<<" "; } } std::cout << std::endl; } }