给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"YES",否则输出"NO"。
输入格式:
第1行:2个数N、K, N为数组的长度, K为需要判断的和(2 ≤N ≤ 20,1 ≤ K ≤ 10^9)
第2 到第 N + 1行:每行1个数,对应数组的元素A[i] (1 ≤ A[i]≤ 10^6)
输出格式:
如果可以,输出:"YES",否则输出"NO"。
样例输入
4 13
1
2
4
7
样例输出
YES
输入样例:
5 9
1
2
3
4
5
输出样例:
YES
时间限制:500ms内存限制:32000kb
题目很简单,直接bfs
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=25;
int ans[maxn];
int n,k;
int flag=0;
void bfs(int x,int temp){
if(flag||temp>k||x>n){
return;
}
if(temp==k){
flag=1;
return;
}
bfs(x+1,temp);
bfs(x+1,temp+ans[x+1]);
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&ans[i]);
}
bfs(1,0);
bfs(1,ans[1]);
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}