遍历子集I
题目
给定一个集合S={0,1,2,...,n-1}请输出集合S的所有子集。
子集的编号:我们用n位二进制00...0001,00...0010,00...0100,...,10...0000来分别表示0,1,...,n-1,子集的编号为该子集中出现元素对应的n位二进制的或。
输入
n,集合S中包含元素0,1,...,n-1。1 ≤ n ≤ 18
输出
d: e0 e1 ... 。
其中d为该子集编号,e0,e1,... 为该子集的元素
注意:当子集为空时,在’:‘后不存在空格
输入样例
4
输出样例
0: 1: 0 2: 1 3: 0 1 4: 2 5: 0 2 6: 1 2 7: 0 1 2 8: 3 9: 0 3 10: 1 3 11: 0 1 3 12: 2 3 13: 0 2 3 14: 1 2 3 15: 0 1 2 3
#include<bits/stdc++.h>
using namespace std;
void print_subset(int n) {
for (int i = 0; i < (1 << n); i++) {
//i: 0~2^n, 每个i的二进制对应一个子集
cout << i << ':';
for (int j = 0; j < n; j++)
if (i & (1 << j))
cout << ' ' << j;
cout << endl;
}
}
int main() {
int n;
cin >> n;
print_subset(n);
}
该篇文章展示了如何用C++代码生成给定集合S的子集,使用位操作技巧,输出每个子集的编号和元素。
1634

被折叠的 条评论
为什么被折叠?



