小S的货船租赁冒险 | 豆包MarsCode AI刷题

45 阅读2分钟

原题链接小S的货船租赁冒险 - MarsCode

问题描述

小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),其中每种货船可以看作一个背包,每个背包有固定的数量、租赁成本和最大载货量。目标是在给定预算内,选择租赁的货船组合,使得总载货量最大。

分析步骤

  1. 定义状态

    • 使用动态规划数组 dp,其中 dp[j] 表示在预算为 j 时的最大载货量。
  2. 初始化

    • dp[0] = 0,表示预算为 0 时,最大载货量为 0。
    • 其他 dp[j] 初始化为 0。
  3. 状态转移

    • 对于每种货船类型,遍历其数量,并更新动态规划数组。
    • 对于每种货船类型的每一艘船,更新 dp 数组,考虑是否租赁该船。
  4. 结果

    • 最终 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];
}