0
点赞
收藏
分享

微信扫一扫

蓝桥杯算法入门_15 (动态压缩 - 二进制集合)

小a草 2022-03-16 阅读 41

目录

二进制集合

*/

#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;

}
举报

相关推荐

0 条评论