二进制枚举
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;
以上是关于二进制枚举的主要内容,如果未能解决你的问题,请参考以下文章