1
枚举 n 的子集,其中 k 为 n 的位数
void hh(int n){
for (int i=n; i; i=(i-1)&n) printf("%d ",i);
}
- 时间复杂度为 n 的子集个数,小于 2^k。
- 易证(可参考下面的证法)
2
枚举 n 所有子集的所有子集
void hh(int n){
for (int i=n; i; i=(i-1)&n) hh(i);
}
- 时间复杂度小于 3^k。
- 证明
设枚举出 n 的子集为 m,之后枚举出 m 的子集 s;
对于 s 的某一位上的数 i ,只有以下三种情况,于是总时间复杂度就是 3^k 了:
i&n | i&m |
---|---|
1 | 1 |
1 | 0 |
0 | 0 |
3
枚举 n 的子集的子集的子集……
程序以此类推,时间复杂度也类似,不过似乎不太用的到。
应用
http://uoj.ac/contest/43/problem/370
可以看看这题,巧妙运用枚举子集来降低时间复杂度。