二进制枚举

Posted tyner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制枚举相关的知识,希望对你有一定的参考价值。

子集生成(二进制法)

输出子集s对应的各个元素

void print_subset(int n. int s) //打印0,1,2...n-1的子集s
    for(int i = 0; i < n; i++) 
        if(s & (1<<i)) printf("%d ", i);
    printf("\n");

枚举子集

for(int i = 0; i < (1<<n); i++) //枚举各个子集对应的编码0,1,2...2的n次-1
    print_subset(n,i);

枚举比x大的最小数,比x小的最大数

#include <cstdio>
#include <algorithm>

int n, X, ans;
int a[111]; 

int main() 
    scanf("%d", &n);//n: a1  a2  a3  a4  。。 
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    scanf("%d", &X);
    for(int i = 0; i < (1 << n); i++) //最大值 == 2的n - 1 次方 
        int tmp = 0;
        for(int j = 1; j <= n; j++) 
            if(i & (1 << j - 1)) //当这个式子 != 0 时 说明 找到 
                tmp += a[j];
            
//          if((i >> j - 1) & 1) 
        
        if(tmp == X) ans++;
    
    printf("%d\n", ans);
    return 0;

以上是关于二进制枚举的主要内容,如果未能解决你的问题,请参考以下文章

[枚举] aw3711. 方格涂色(二进制枚举+模拟)

关于二进制枚举

二进制枚举

[枚举] aw3646. 分水果(二进制枚举+思维)

JOYOI1266 费解的开关 - 枚举+递推枚举二进制状态

[枚举] aw116. 飞行员兄弟(二维递推+开关问题+二进制枚举)