找数达人 nyoj1221

找数达人

时间限制: 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
样例输出
YesNo
来源
easy++
上传者
chuan


解题思路:这道题与01背包思路一样,可以通过不断重复利用一个数组来实现。

#include
#include
#include
using namespace std;
char s[1001];
int a[1001],m,dp[1001];
int main()
{
    while(gets(s))
    {
        int n=0;
        memset(dp,0,sizeof(dp));
        for(int i=0; s[i]!='\0'; i++)
            if(s[i]>='0'&&s[i]<='9')
                a[n++]=s[i]-'0';
        scanf("%d",&m);  
        getchar();  //一定要加  不然会错
        for(int i=0; i             for(int k=m; k>=a[i]; k--)
                dp[k]=max(dp[k],dp[k-a[i]]+a[i]);
        if(dp[m]==m)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

#include
#include
#include
using namespace std;
char s[1001];
int a[1001],m,dp[1001];
int main()
{
    while(gets(s))
    {
        int n=0;
        memset(dp,0,sizeof(dp));
        for(int i=0; s[i]!='\0'; i++)
            if(s[i]>='0'&&s[i]<='9')
                a[n++]=s[i]-'0';
        scanf("%d",&m);  
        getchar();  //一定要加  不然会错
        for(int i=0; i=a[i]; k--)
                dp[k]=max(dp[k],dp[k-a[i]]+a[i]);
        if(dp[m]==m)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}


你可能感兴趣的:(动态规划)