目录
二进制集合
*/
#include <iostream>
using namespace std;
/*
喝酒 , 遇到店 * 2,遇到花 -1
遇到店 5次 ,遇到花 10 次 ,
分析: 前面14次操作 ,最后剩下1 (最后一次遇到花 ,喝光了)
枚举14次操作 二进制集合 的子集 ,看每次是否合法 ,留下合法序列
判断二进制位是否有 5个1 和 9个0 ,并且酒最终只剩1斗
(输入所有元素 ,选取任意个 达到目标值) --(输出方案数)
输入:
6 6
1 2 3 4 5 6
输出:
4
输入:
6 6
1 2 3 4 5 7
输出:
3
输入:
6 6
1 2 3 4 5 0
输出:
6
*/
//二进制枚举
int n_01,x_01,ans_01 = 0,a_01[30]; //从 n_01个互不相同的正整数,无重复的选取任意个数,并仅通过加法凑出整数 X ,
void test_01(){
cin >> n_01 >> x_01;
for(int i = 0;i < n_01;i++){
cin >> a_01[i];
}
for(int i = 0;i < (1 << n_01);i++){ //列举出所有可能 遍历所有子集 n*n - 1 种
int num = 0;
for(int j = 0;j < n_01;j++){ //n次循环表示要查看n个整数 哪些被选中
if(i & (1 << j)){ //代表我们如果选择了第j个整数,就把对应的整数加到num中
num += a_01[j];
}
}
if(num == x_01){ //满足条件
ans_01++;
}
}
cout << ans_01 << endl;
return;
}
动态压缩 (待更新)
旅行商问题
int main() {
test_01();
return 0;
}