/* 找数达人
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述
小明最近做出了一道题:如何在一组数中寻找三个数,这三个数的和等于一给出的定值m,洋洋得意。于是小华不乐意了,小华说,你能找找在一组数字中是否有n个数,
使得这n个数的和等于一给定的定值m吗?
1.0 < 数字大小 <= 1000
2. 0 < 序列中数字个数 <= 1000
3. 0 <= m <=1000
输入
多组数据,每组两行,第一行为序列内容,第二行为m的值。
输出
如能找到,输出Yes,否则,输出No。
样例输入
1 3 4 5
5
1 3 4 5 9
2
样例输出
Yes
No
*/
//思路:想到01背包就简单了
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[1005];
int a[1005];
int main(){
char c;
while(~scanf("%d%c", &a[0], &c)){ //表示不会数据的输入#_#
int m, i = 0;
memset(dp, 0, sizeof(dp));
while(c != '
')
scanf("%d%c", &a[++i], &c);
scanf("%d", &m);
for(int j = 0; j <= i; j++){ //注意这里要小于等于i
for(int k = m; k >= a[j]; k--){
if(dp[k - a[j]] + a[j] > dp[k])
dp[k] = dp[k - a[j]] + a[j];
}
}
if(dp[m] == m)
printf("Yes
");
else
printf("No
");
}
return 0;
}