找数达人
-
描述
-
小明最近做出了一道题:如何在一组数中寻找三个数,这三个数的和等于一给出的定值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
想法:简单(01)背包
给出动态转移方程:data[j]=max(data[j-a[i]]+a[i],data[j]);
代码:
#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
return x>y?x:y;
}
int a[1010];
int data[1010];
int main()
{
int i,j,m,n;
char k;
memset(a,0,sizeof(a));
while(scanf("%d%c",&a[1],&k)!=EOF)
{
n=1;
while(k!='\n')
scanf("%d%c",&a[++n],&k);
scanf("%d",&m);
memset(data,0,sizeof(data));
int flag=0;
for(i=1;i<=n;i++)
{
for(j=m;j>=a[i];j--)
{
data[j]=max(data[j-a[i]]+a[i],data[j]);
}
}
if(data[m]==m)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}