子集枚举法分为三种:增量构造法/位向量法/ 二进制法
而在《深入浅出》中提到了二进制法
二进制法
类似于位向量法,同样也是枚举各个位置的状态,但这次用二进制表示,二进制长度为N,与原集合大小相同。二进制的第 i 位代表原集合中的第 i 位是否被选中,枚举各种情况。集合大小为N,就是2的N次种方式。此时要运用数学知识————并集、补集、交集、包含、属于等情况。
-
设A、B为两个集合的二进制表示,则
- 交集表示为 A & B
- 并集表示为 A | B
- 对称差集表示为 A ^ B
- 补集表示为 ALL ^ A [其中 ALL = (1 << n) - 1]
-
[枚举所有子集]:
枚举 0 到 (1 << n) - 1 中的每个数字 i,然后将数字 i 转化为二进制,
如果 i 的第 j 位是 1,表示集合 i 包含 a[j];
如果 i 的第 j 位是 0,表示集合 i 不包含 a[j]。
模板
- 打印数字 i 代表的集合
1 2 3 4 5 6 7 8 |
|
- 枚举所有子集
1 2 3 4 5 |
|
- 枚举所有大小为 k 的子集
1 2 3 4 5 6 7 |
|
- [枚举一个给定集合 x 的所有子集]
1 2 3 4 5 |
|