货船租凭冒险

42 阅读2分钟

解题思路

  1. 问题理解

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

    • 使用动态规划(Dynamic Programming, DP)来解决这个问题。
    • 定义一个二维数组 dp[i][j],表示在前 i 种货船中,花费不超过 j 元时能获得的最大载货量。
  3. 算法步骤

    • 初始化 dp 数组,dp[0][j] = 0 表示没有货船时,无论预算多少,载货量都是0。
    • 对于每种货船 i,遍历其数量 m[i],更新 dp 数组。
    • 对于每个预算 j,考虑是否选择当前货船:
      • 如果不选择当前货船,dp[i][j] = dp[i-1][j]
      • 如果选择当前货船,dp[i][j] = max(dp[i][j], dp[i-1][j-k*v[i]] + k*w[i]),其中 k 是当前货船的数量。

伪代码框架

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(m + 1):
                if j >= k * v:
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - k * v] + k * w)
    
    return dp[Q][V]

代码提示

你可以根据上述伪代码框架,在 solution 函数中实现具体的逻辑。以下是一些关键步骤的提示:

  1. 初始化 dp 数组

    dp = [[0] * (V + 1) for _ in range(Q + 1)]
    
  2. 遍历每种货船

    for i in range(1, Q + 1):
        m, v, w = ships[i - 1]
        for j in range(V + 1):
            for k in range(m + 1):
                if j >= k * v:
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - k * v] + k * w)
    
  3. 返回最终结果

    return dp[Q][V]