找数达人 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<stdio.h>
    #include<string.h>
    #include<algorithm>
    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<n; 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<stdio.h>
    #include<string.h>
    #include<algorithm>
    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<n; 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;
    }
    


    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值