知识预备-二进制枚举详细讲解:
题目描述及相关代码
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;
}
标签:blog,relevant,训练,int,蓝桥,pc,算法,csdn,87544214
From: https://www.cnblogs.com/qinyueblog/p/16908581.html