使用位生成子集

Posted shuiyonglewodezzzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用位生成子集相关的知识,希望对你有一定的参考价值。

  定义:

    对于任何一个集合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个元素
集合元素个数 位表示法
0 0
1

01   和 10

2 11

由此有,我们需要枚举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;


    

 

以上是关于使用位生成子集的主要内容,如果未能解决你的问题,请参考以下文章

暴力求解法——子集生成(位向量法)

暴力求解法——子集生成(位向量法)

暴力求解法——子集生成(位向量法)

子集生成——增量构造法+位向量法+二进制法

子集生成

算法竞赛入门经典7.3子集生成增量构造法位向量法二进制法