问题描述
小S在码头租用货船,有 Q 种不同类型的货船可供选择。每种货船有固定的数量 m[i]、租赁成本 v[i] 和最大载货量 w[i]。小S希望在预算 V 元内,租用能够承载最大总货物的货船组合。每种货船的具体信息包括数量、租赁价格和载货量。小S需要你帮忙计算在给定预算下,她能租用的货船的最大总载货量是多少。
Q: 货船的种类数量。V: 李华可用的总预算(单位:元)。ships: 一个列表,其中每个元素是一个元组[m[i], v[i], w[i]],分别表示第i种货船的数量、租赁价格和每艘货船的最大载货量。
测试样例
样例1:
输入:
Q = 2,V = 10,ships = [[2, 3, 2], [3, 2, 10]]
输出:32
样例2:
输入:
Q = 3,V = 50,ships = [[5, 10, 20], [2, 20, 30], [3, 15, 25]]
输出:100
样例3:
输入:
Q = 1,V = 100,ships = [[10, 5, 50]]
输出:500
样例4:
输入:
Q = 4,V = 100,ships = [[1, 100, 200], [2, 50, 100], [3, 33, 66], [4, 25, 50]]
输出:200
样例5:
输入:
Q = 2,V = 300,ships = [[100, 1, 1], [50, 5, 10]]
输出:550
问题分析
这个问题是一个典型的多重背包问题(Multiple Knapsack Problem),其中每种货船可以看作一个背包,每个背包有固定的数量、租赁成本和最大载货量。目标是在给定预算内,选择租赁的货船组合,使得总载货量最大。
分析步骤
-
定义状态:
- 使用动态规划数组
dp,其中dp[j]表示在预算为j时的最大载货量。
- 使用动态规划数组
-
初始化:
dp[0] = 0,表示预算为 0 时,最大载货量为 0。- 其他
dp[j]初始化为 0。
-
状态转移:
- 对于每种货船类型,遍历其数量,并更新动态规划数组。
- 对于每种货船类型的每一艘船,更新
dp数组,考虑是否租赁该船。
-
结果:
- 最终
dp[V]即为在预算V内能够租用的货船的最大总载货量。
- 最终
代码实现如下:
#include <iostream>
#include <vector>
using namespace std;
int solution(int Q, int V, vector<vector<int>> ships) {
vector<int> dp(V + 1, 0); // dp[j] 表示预算为 j 时的最大载货量
for (int i = 0; i < Q; ++i) {
int m = ships[i][0]; // 数量
int v = ships[i][1]; // 价格
int w = ships[i][2]; // 载货量
for (int j = V; j >= v; --j) {
for (int k = 0; k <= m && k * v <= j; ++k) {
dp[j] = max(dp[j], dp[j - k * v] + k * w);
}
}
}
return dp[V];
}