二进制枚举集合子集
题目描述
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库给定一个数组,枚举输出其所有子集,(空行代表空集)
输入
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库第一行一个整数n
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库第二行n个整数,空格分隔
输出
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库多行,数组所有子集。按数组原来元素顺序逐一输出
样例输入
3
3 6 7
样例输出
3
6
3 6
7
3 7
6 7
3 6 7
提示
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库1 <= n <= 20
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库1) 要求集合中不能有两个相邻的元素
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库if ((mask >> 1) & mask) continue;
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库2) 在限定必须不取某些元素的前提下枚举子集
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库// mask的第x位为0表示x必须不在子集中(原集合中不含这个元素):
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库for (int mask1 = mask; mask1 >= 0; mask1 = (mask1 - 1) & mask)
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库3) 在限定必须取某些元素的前提下枚举子集
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库// mask的第x位为1表示x必须在子集中:
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库for (int mask1 = mask; mask1 < (1 << m); mask1 = (mask1 + 1) | mask)
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库4) 找出二进制中恰好含有 k个1的所有数
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库for (int mask = 0; mask < 1 << n; ) {
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库int tmp = mask & -mask;
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库mask = (mask + tmp) | (((mask ^ (mask + tmp)) >> 2) / tmp);
ua5100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库}