//code by virtualtan 忘了啥时候
//二进制枚举:
//枚举集合中的元素
#include <bits/stdc++.h>
using namespace std;
int main() {
int n=3,a[3]= {2,4,5};
for(int i=0; i<(1<<n); i++) { //二进制枚举//枚举每一个状态
cout<<"i="<<i<<endl;
for(int j=0; j<n; j++) { //枚举该状态下二进制的每一位数值
int c=i&(1<<j); //计算i&(1<<j)值,用于下面调试中输出
cout<<i<<"&(1"<<"<<"<<j<<")="<< c <<endl;
if(i&(1<<j))//当前状态的第i位 ?是否为1(存在
printf(" %d\n ",a[j]);
}
cout<<endl;
}
return 0;
}
另一种形式
//枚举比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;
}