青训营笔记8 | 豆包MarsCode AI刷题

0 阅读2分钟

问题描述

小S的货船租赁冒险

小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

思路

需要在给定的预算 V 内,选择不同类型的货船,使得总载货量最大化。每种货船有数量限制、租赁成本和载货量。

数据结构选择

  • 动态规划:这是一个典型的背包问题变种,这里用动态规划来解决。我们可以定义一个二维数组 dp,其中 dp[i][j] 表示在前 i 种货船中,花费不超过 j 元时能获得的最大载货量。

算法步骤

  1. 初始化:创建一个二维数组 dp,大小为 (Q+1) x (V+1),初始值为 0。

  2. 状态转移

    • 对于每种货船 i,遍历其数量 m[i],尝试将其加入到当前预算 j 中。
    • 更新 dp[i][j]dp[i][j] = max(dp[i][j], dp[i-1][j-k*v[i]] + k*w[i]),其中 k 是当前货船的数量,v[i] 是租赁成本,w[i] 是载货量。
  3. 结果:最终答案为 dp[Q][V],即在前 Q 种货船中,花费不超过 V 元时能获得的最大载货量。

实现

def solution(Q, V, ships):
    # 初始化 dp 数组
    dp = [[0] * (V + 1) for _ in range(Q + 1)]
    
    # 遍历每种货船
    for i in range(1, Q + 1):
        m, v, w = ships[i - 1]
        # 遍历预算
        for j in range(V + 1):
            # 遍历当前货船的数量
            for k in range(min(m, j // v) + 1):
                dp[i][j] = max(dp[i][j], dp[i - 1][j - k * v] + k * w)
    
    return dp[Q][V]