青训营X豆包MarsCode 技术训练营第一课

32 阅读3分钟

小S在码头租用货船,有 Q 种不同类型的货船可供选择。每种货船有固定的数量 m[i]、租赁成本 v[i] 和最大载货量 w[i]。小S希望在预算 V 元内,租用能够承载最大总货物的货船组合。每种货船的具体信息包括数量、租赁价格和载货量。小S需要你帮忙计算在给定预算下,她能租用的货船的最大总载货量是多少。

  • Q: 货船的种类数量。
  • V: 李华可用的总预算(单位:元)。
  • ships: 一个列表,其中每个元素是一个元组 [m[i], v[i], w[i]],分别表示第 i 种货船的数量、租赁价格和每艘货船的最大载货量。
  • 这道题目可以看作是一个多重背包问题的变种。我们需要在有限的预算内,选择不同类型的货船,使得总载货量最大化。

解题思路

  1. 理解问题

    • 我们有 Q 种不同类型的货船,每种货船有数量 m[i]、租赁成本 v[i] 和最大载货量 w[i]
    • 我们需要在预算 V 元内,选择货船使得总载货量最大化。
  2. 数据结构选择

    • 使用动态规划(Dynamic Programming, DP)来解决这个问题。
    • 定义一个一维数组 dp,其中 dp[j] 表示在预算为 j 元时的最大载货量。
  3. 算法步骤

    • 初始化 dp 数组,dp[0] = 0,其余 dp[j] = 0
    • 对于每种货船 i,遍历其数量 m[i],尝试将其加入到当前预算 j 中。
    • 更新 dp[j] 为 dp[j - v[i]] + w[i] 和 dp[j] 中的较大值。
  4. 伪代码

    python

    def solution(Q, V, ships):

        dp = [0] * (V + 1)

        for m, v, w in ships:

            for _ in range(m):

                for j in range

                (V, v - 1, -1):

                    dp[j] = max

                    (dp[j], dp

                    [j - v] + w)

        return dp[V]

关键点

  • 逆序遍历:为了避免重复计算,我们在更新 dp 数组时需要从后往前遍历。
  • 多重背包:每种货船的数量是有限的,因此我们需要遍历每种货船的数量。
  • 处理每种货船的数量限制是解决这个问题的关键。我们可以通过多次遍历每种货船的数量来实现这一点。具体来说,我们可以使用一个嵌套循环来遍历每种货船的数量,并在每次遍历时更新 dp 数组。

具体步骤

  1. 外层循环:遍历每种货船。
  2. 中层循环:遍历每种货船的数量。
  3. 内层循环:更新 dp 数组,确保在当前预算下选择该货船的最大载货量。

代码实现

以下是处理每种货船数量限制的代码实现:

python

def solution(Q, V, ships):

    dp = [0] * (V + 1)

    for m, v, w in ships:

        for _ in range(m):  

        # 遍历每种货船的数量

            for j in range

            (V, v - 1, -1)

            :  # 逆序遍历预算

                dp[j] = max

                (dp[j], dp

                [j - v] + w)

    return dp[V]

解释

  • 外层循环for m, v, w in ships: 遍历每种货船。
  • 中层循环for _ in range(m): 遍历每种货船的数量。
  • 内层循环for j in range(V, v - 1, -1): 逆序遍历预算,确保在当前预算下选择该货船的最大载货量。

关键点

  • 逆序遍历:为了避免重复计算,我们在更新 dp 数组时需要从后往前遍历。
  • 多重背包:每种货船的数量是有限的,因此我们需要遍历每种货船的数量。

示例

假设我们有以下输入:

python

Q = 2

V = 10

ships = [[2, 3, 2], [3, 2, 

10]]

  • 对于第一种货船 [2, 3, 2],我们有 2 艘,每艘成本 3 元,载货量 2。
  • 对于第二种货船 [3, 2, 10],我们有 3 艘,每艘成本 2 元,载货量 10。

通过上述代码,我们可以计算出在预算 10 元内,能够租用的货船的最大总载货量。