P1049 装箱问题
题目大意
题目链接:P1060 开心的金明
有N元钱,希望购买M个物品,每个物品的价格和重要度都是正整数,重要度分五等,为1~5。每个物品的价值是 价格 * 重要度,求N元钱能买到的最大价值。
这题符合背包问题的基本要素:一个背包(在题目里是N元钱),M个物品,每个物品有体积(价格)和价值(价格*重要度),求背包能装下的最大价值。如果你还不知道什么是背包问题,那么请看我的背包问题学习笔记。
通过分析题意得知,每个物品最多买一个,所以这题为01背包。
思路
这题除了输入,其他与01背包模板没有区别,所以这里只说输入:
- 第一行输入总钱数(即背包体积)和物品个数。
- 第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;
}