找数达人
时间限制:
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 551 3 4 5 92
样例输出
-
Yes
-
No
//注意数据的处理
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[1000+100];
int a[1000+100];
char c;
bool isnumber(char a)
{
if(a>='0' && a<='9')
return true;
return false;
}
int main()
{
int num,m;
while(cin>>num) //骚操作,很强啊!!!
{
int k=1;
do
{
if(num>0)
a[k++]=num;
num=0;
while(isnumber(c=getchar()))
{
num=num*10+c-'0';
}
}while(c!='\n');
if(num>0)
a[k++]=num;
a[0]=k;
scanf("%d",&m);
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(int i=1; i<a[0]; i++)
{
for(int j=m; j>=a[i]; j--)
{
if(dp[j-a[i]]!=-1)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
}
if(dp[m]==-1)
printf("No\n");
else
printf("Yes\n");
}
return 0;
} //ac