找数达人
时间限制:
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背包问题,就是能否把容量为m的背包装满。
#include<stdio.h>
#include<string.h>
#define Max(a,b) a>b?a:b
int dp[10000];
int num[10000];
int main()
{
int n,m;
int count=0;
char c;
while(scanf("%d%c",&n,&c)!=EOF)
{
count=0;
num[count++]=n;
while(scanf("%d%c",&n,&c))
{
num[count++]=n;
if(c=='\n') break;
}
memset(dp,0,sizeof(dp));
scanf("%d",&m);
for(int i=0;i<count;i++)
{
for(int j=m;j>=num[i];j--)
{
dp[j]=Max(dp[j],dp[j-num[i]]+num[i]);
}
}
// for(int i=1;i<=m;i++) printf("%d ",dp[i]);
// printf(" #\n");
if(dp[m]==m) printf("Yes\n");
else printf("No\n");
}
}
找数达人
时间限制:
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背包问题,就是能否把容量为m的背包装满。
#include<stdio.h>
#include<string.h>
#define Max(a,b) a>b?a:b
int dp[10000];
int num[10000];
int main()
{
int n,m;
int count=0;
char c;
while(scanf("%d%c",&n,&c)!=EOF)
{
count=0;
num[count++]=n;
while(scanf("%d%c",&n,&c))
{
num[count++]=n;
if(c=='\n') break;
}
memset(dp,0,sizeof(dp));
scanf("%d",&m);
for(int i=0;i<count;i++)
{
for(int j=m;j>=num[i];j--)
{
dp[j]=Max(dp[j],dp[j-num[i]]+num[i]);
}
}
// for(int i=1;i<=m;i++) printf("%d ",dp[i]);
// printf(" #\n");
if(dp[m]==m) printf("Yes\n");
else printf("No\n");
}
}