10-能不能组成m

/*                                              找数达人
              时间限制: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背包就简单了

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[1005];
int a[1005];

int main(){
    char c;
    while(~scanf("%d%c", &a[0], &c)){    //表示不会数据的输入#_#
        int m, i = 0;
        memset(dp, 0, sizeof(dp));
        while(c != ' ')
            scanf("%d%c", &a[++i], &c);
        scanf("%d", &m);
        
        for(int j = 0; j <= i; j++){   //注意这里要小于等于i
            for(int k = m; k >= a[j]; k--){
                if(dp[k - a[j]] + a[j] > dp[k])
                    dp[k] = dp[k - a[j]] + a[j];
            }    
        }
        if(dp[m] == m)
            printf("Yes ");    
        else
            printf("No ");
        }
    return 0;
}

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7397779.html