蓝桥杯-算法训练-和为T

知识预备-二进制枚举详细讲解:

https://sugar.blog.csdn.net/article/details/81099340?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-1-81099340-blog-87544214.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-1-81099340-blog-87544214.pc_relevant_recovery_v2&utm_relevant_index=2

题目描述及相关代码

1.https://blog.csdn.net/qq_43568078/article/details/87544214
2.https://blog.csdn.net/murphypu/article/details/69053861?spm=1001.2014.3001.5501

参考代码如下:

#include<iostream>
using namespace std;
int a[100005];
int main()
{
	int n;
	scanf("%d",&n);      //n代表一共多少个元素 
	for(int i=0;i<n;i++) //循环输入n个元素 
	{
		scanf("%d",&a[i]);
	}
	int num=0,sum,T;//num 代表多少种解  sum为几个元素的和   T为题目给定的 
	scanf("%d",&T);
	for(int i=1;i<(1<<n);i++)//二进制枚举1-2的n+1次方的数
	{
		sum=0;
		for(int j=0;j<n;j++)//找出每位的选与不选 比如i=4 表示100  只有& 100 结果才为1  100=1<<2(j)  j=2表示选中的下标为2的数 
		{
			if(i&(1<<j))   //注意:这里是&也就是与运算,先转化为二进制数,然后按位进行与运算 
			{
				sum+=a[j];  //把选中的哪几位 分别找到对应的元素进行求和 
			}
		}
		if(sum == T)//如果成立输出
		{
			for(int j = 0;j < n;j++)
			{
				if(i & (1<<j)) //找哪个元素之和使得=T,并分别输出 
				{
					cout<<a[j]<<" ";
				}
			}
			num++;  //解数+1 
			cout<<endl;
		}
	}
	printf("%d\n",num);
	return 0;
}
posted @ 2022-11-20 15:17  Qin_Yue  阅读(210)  评论(0)    收藏  举报