资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定一个数组a[1..n],请从中选出若干个数,使得他们的和为X
输入格式
输入第一行包含两个整数n和X
第二行包含n个整数,分别表示a[1],a[2],...,a[n]
输出格式
输出有多少种选法
样例输入
5 4
1 1 1 1 2
样例输出
7
数据规模和约定
n不超过20,X和a[i]不超过30
思路:
直接dfs就好了,对于每个数字,可以选和不选,当加到最后一个数字结果等于x,ans就+1。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,x,ans=0;
int num[25];
void dfs(int sum,int step)
{
if(step>=n)//加到n个数判断并返回
{
if(sum==x) ans++;
return;
}
dfs(sum,step+1);//选择不加这个数
dfs(sum+num[step],step+1);//选择加这个数
}
int main()
{
int i;
cin>>n>>x;
for(i=0;i<n;i++) cin>>num[i];
dfs(0,0);
cout<<ans;
return 0;
}