任务描述
本关任务:计算寻宝人所能带走的宝物的最大价值。
一个寻宝人在沙漠中发现一处神秘的宝藏,宝藏中共有n
个宝物(n
不超过20
),每个宝物的重量不同,价值也不同,宝物i
的重量是wi
,其价值为vi
。
寻宝人所能拿走的宝物的总重量为m
(m
不超过50
)。请帮助寻宝人写一个程序,计算寻宝人能够获得的最大总价值。
编程要求
在右侧编辑器中有一个函数MaxValue
,它有四个参数values
,weights
,n
,m
。
values
和weights
分别存放了n
件宝物的价值和重量,m
为寻宝人所能携带的最大重量。
请在这个函数中补充代码,计算并输出寻宝人所能获得的最大总价值。
输入数据由评测系统读取,并传递给MaxValue
函数。具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
测试输入: 3 10
3 4
4 5
5 6
预期输出: 11
每组输入有多行,第一行有两个数n
和m
,分别为宝石数量和寻宝人载重。下面有n
行数据,每一行有两个数,分别是宝石重量和宝石价值。
#include <iostream>
using namespace std;
// 包含必要的头文件
// 定义全局变量 n 和 m,分别表示物品的数量和背包的容量
int n, m;
// 定义函数 MaxValue,用于计算背包能够容纳的最大价值
void MaxValue(int values[], int weights[], int n, int m)
{
// 定义二维数组 dp 用于保存子问题的解
int dp[300][300];
// 初始化边界条件
for (int i = 0; i < 300; i++)
{
dp[0][i] = 0;
dp[i][0] = 0;
}
// 遍历每个物品
for (int i = 0; i < n; i++)
{
// 遍历背包容量从 1 到 m
for (int j = 1; j <= m; j++)
{
// 如果当前物品的重量小于等于当前背包容量,则可以考虑放入背包
if (j >= weights[i])
{
// 选择放入或不放入当前物品,取价值较大的方案
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i]] + values[i]);
}
else
{
// 如果当前物品的重量大于当前背包容量,则无法放入背包
dp[i][j] = dp[i - 1][j];
}
}
}
// 输出背包能够容纳的最大价值
cout << dp[n - 1][m] << endl;
}