使用位生成子集

  定义:

    对于任何一个集合B,只要A 包含于 B 那么A即是B的子集,每个集合子集个数为2^n个(n为集合中元素的个数)

考虑数2^n,它的第n位是1(第一位是第0位).它总共包含2^n 个数字。

n=0   2^n=1  空集

n=1 2^1=2  空集+只有一个元素的集合

假设以下n=2

n=2总共有4个元素
集合元素个数位表示法
00
1

01   和 10

211

由此有,我们需要枚举2^n次,每次检查生成数字的位数是否为1,如果有1的,说明应该取对应的元素。代码如下。

void subset(int n,int * a)
{
    for (int i = 0;i < (1 << n);i++)
    {
        for (int j=0;j < i; j++) 
        {
            if (i&(1<<j)) 
            {
                std::cout << a[j]<<" ";
            }
        }
        std::cout << std::endl;


    }

}

 

posted on 2019-06-18 23:51 好吧,就是菜菜 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/11048690.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值