码迷,mamicode.com
首页 > 其他好文 > 详细

二进制枚举

时间:2019-06-28 00:37:12      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:oid   set   tmp   class   cpp   ret   pre   输出   sub   

子集生成(二进制法)

输出子集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;
}

二进制枚举

标签:oid   set   tmp   class   cpp   ret   pre   输出   sub   

原文地址:https://www.cnblogs.com/tyner/p/11100375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!