【洛谷】P1060 开心的金明

108 阅读1分钟

P1049 装箱问题

题目大意

题目链接:P1060 开心的金明

有N元钱,希望购买M个物品,每个物品的价格和重要度都是正整数,重要度分五等,为1~5。每个物品的价值是 价格 * 重要度,求N元钱能买到的最大价值。

这题符合背包问题的基本要素:一个背包(在题目里是N元钱),M个物品,每个物品有体积(价格)和价值(价格*重要度),求背包能装下的最大价值。如果你还不知道什么是背包问题,那么请看我的背包问题学习笔记

通过分析题意得知,每个物品最多买一个,所以这题为01背包。

思路

这题除了输入,其他与01背包模板没有区别,所以这里只说输入:

  1. 第一行输入总钱数(即背包体积)和物品个数。
  2. 第2~N+1行每行输入两个正整数,w[i] = 第一个数,v[i] = 两个数的乘积

代码

#include<cstdio>
#include<stack>
#include<iostream>
using namespace std;
long long vv,n,w[50],v[50],f[30010];
int main(){
    cin >> vv >> n;
    for (int i = 1;i <= n;++i) cin >> w[i] >> v[i],v[i] *= w[i]; 
    for (int i = 1;i <= n;++i){
        for (int j = vv;j >= w[i];--j){ 
            f[j] = max(f[j],f[j - w[i]] + v[i]); 
        }
    }
    cout << f[vv];
    return 0;
}


本文使用 文章同步助手 同步