0-1背包判断物品能否组合问题

谁说我不能喝 提交于 2019-11-27 05:47:41

题目描述

小米之家是成人糖果店。里面有很多便宜,好用,好玩的产品。中秋节快到了,小米之家想给米粉们准备一些固定金额大礼包。对于给定的一个金额,需要判断能不能用不同种产品(一种产品在礼包最多出现一次)组合出来这个金额。聪明的你来帮帮米家的小伙伴吧。

输入描述:

输入 N (N 是正整数, N  <= 200)
输入 N 个价格p(正整数, p <= 10000)用单空格分割
输入金额 M(M是正整数,M <= 100000 )

输出描述:

能组合出来输出 1
否则输出 0

示例1

输入

复制

6
99 199 1999 10000 39 1499
10238

输出

复制

1
#include <iostream>
#include<vector>
using namespace std;

int main(){
    int N;
    vector<int> Input;
    int M;
    scanf("%d",&N);
    for(int i = 0;i < N;i ++){
        int tmp;
        scanf("%d",&tmp);
        Input.push_back(tmp);
    }
    scanf("%d",&M);
    vector<bool> dp(M + 1,false);
    dp[0] = true;
    for(int i = 0;i < Input.size();i ++){
        for(int j = M;j >=Input[i];j --){
            dp[j] = dp[j] || dp[j - Input[i]];
        }
    }
    if(dp[M]){
        printf("1");
    }
    else{
        printf("0");
    }
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!