某君有 nnn 个互不相同的正整数,现在他要从这 nnn 个正整数之中无重复地选取任意个数,并仅通过加法凑出整数 XXX。
求某君有多少种不同的方案来凑出整数 XXX。
输入格式
第一行,输入两个整数 n,X(1≤n≤20,1≤X≤2000)n,X(1 \leq n \leq 20, 1 \leq X \leq 2000)n,X(1≤n≤20,1≤X≤2000)。
接下来输入 nnn 个整数,每个整数不超过 100100100。
输出格式
输出一个整数,表示能凑出 X?X?X? 的方案数。
样例输入
6 6
1 2 3 4 5 6
样例输出
4
解:
二进制枚举法,一个个去判断。
代码
#include"iostream"
using namespace std;
int main()
{
int n,X,a[20],sum,time=0;
cin>>n>>X;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<(1<<n);i++)//(1<<n):把1转化为2进制后在后面添加n个0
{//枚举所有可能种类
sum=0;
for(int j=0;j<n;j++)
{//1表示选取了该位置的数
if(i&(1<<j))sum+=a[j];
}
if(sum==X)time++;
}
cout<<time<<endl;
return 0;
}