Home => ProblemSet => 2.12-30:二进制枚举集合子集
Problem1513--2.12-30:二进制枚举集合子集

1513: 2.12-30:二进制枚举集合子集

Time Limit: 1 Sec  Memory Limit: 128 MB  Submit: 0  Solved: 3
[ Submit ] [ Status ] [ Creator: ][ 参考程序 ]

Description

给定一个数组,枚举输出其所有子集,(空行代表空集)

Input

第一行一个整数n
第二行n个整数,空格分隔

Output

多行,数组所有子集。按数组原来元素顺序逐一输出

Sample Input Copy

3
3 6 7

Sample Output Copy

3
6
3 6
7
3 7
6 7
3 6 7

HINT

1 <= n <= 20





















1) 要求集合中不能有两个相邻的元素
if ((mask >> 1) & mask) continue;

2) 在限定必须不取某些元素的前提下枚举子集
// mask的第x位为0表示x必须不在子集中(原集合中不含这个元素):
for (int mask1 = mask; mask1 >= 0; mask1 = (mask1 - 1) & mask)

3) 在限定必须取某些元素的前提下枚举子集
// mask的第x位为1表示x必须在子集中:
for (int mask1 = mask; mask1 < (1 << m); mask1 = (mask1 + 1) | mask)

4) 找出二进制中恰好含有 k个1的所有数
for (int mask = 0; mask < 1 << n; ) {
int tmp = mask & -mask;
mask = (mask + tmp) | (((mask ^ (mask + tmp)) >> 2) / tmp);
}


Source/Category