遍历子集I

该篇文章展示了如何用C++代码生成给定集合S的子集,使用位操作技巧,输出每个子集的编号和元素。

遍历子集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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值