枚举一个数的子集
2018-03-22 21:51
99 查看
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可以看看这题,巧妙运用枚举子集来降低时间复杂度。
相关文章推荐
- 枚举一个数二进制表示下的子集
- 枚举一个集合的所有子集
- 求一个集合的所有子集
- 想写一个枚举硬盘分区的dll
- 一个集合所有子集和为sum的组合打印
- 定义一个交通灯枚举
- newcoder Wannafly挑战赛6 B-比赛(枚举子集)
- java中获取一个集合(Set)的子集的方法
- 输出一个集合的所有子集,从长到短
- UVa 1508 Equipment 解题报告(枚举子集)
- 嘿牛程序员__成都传智博客__枚举的一个带有case的普通实现——以星期的转换为例
- 【CDOJ 1355】柱爷与三叉戟不得不说的故事 【状压DP+子集枚举】
- 用枚举来实现一个交通灯
- 暴力求解法之枚举子集
- UVA - 11181 Probability|Given 概率 + 递归枚举子集
- javascript中使用枚举定义一个对象进行数据转换
- 一个C++宏定义与枚举定义重复的编译错误
- 二进制枚举子集
- enum 枚举 在 数组下标的 一个用法
- 【UVA】1151 - Buy or Build(二进制枚举子集 + 并查集)