小S的货船租赁大冒险:如何在预算内装满货舱? | 豆包MarsCode AI刷题

74 阅读3分钟

小S的货船租赁大冒险:如何在预算内装满货舱?

大家好,今天我们来聊聊小S的货船租赁大冒险。小S在码头遇到了一个难题:她需要在有限的预算内,租用能够承载最大货物的货船组合。听起来是不是有点像在玩一个策略游戏?让我们一起来看看如何用动态规划(DP)来解决这个有趣的问题。

问题概述

小S有 Q 种不同类型的货船可供选择,每种货船有固定的数量、租赁成本和最大载货量。她的目标是:在预算 V 元内,租用能够承载最大总货物的货船组合。

举个例子

假设小S有以下货船选择:

  • 货船A:数量2,租赁成本3元,载货量2吨
  • 货船B:数量3,租赁成本2元,载货量10吨

她的预算 V 是10元。那么,她应该如何选择货船,才能在10元内装满最多的货物呢?

动态规划:我们的秘密武器

动态规划(DP)是一种非常强大的算法技术,特别适合解决这类“在有限资源内最大化收益”的问题。我们可以用一个数组 dp 来记录在不同预算下能够获得的最大载货量。

1. 定义状态

我们定义 dp[j] 表示在预算为 j 元时能够租用的最大总载货量。

2. 状态转移方程

对于每种货船 (count, cost, capacity),我们需要考虑租用不同数量的该种货船对当前预算的影响。具体来说,我们可以租用 0min(count, j // cost) 艘该种货船。

状态转移方程为:

dp[j] = max(dp[j], dp[j - k * cost] + k * capacity)

其中 k 是从 0min(count, j // cost) 的整数。

3. 初始化

我们初始化 dp[0] = 0,表示预算为 0 时,最大载货量为 0

4. 最终结果

dp[V] 即为在预算为 V 元时能够租用的最大总载货量。

代码实现

让我们来看看如何用Python实现这个算法:

def solution(Q, V, ships):
    # 初始化dp数组,dp[j]表示在预算为j元时的最大载货量
    dp = [0] * (V + 1)
    
    # 遍历每种货船
    for count, cost, capacity in ships:
        # 从大到小遍历预算,避免重复计算
        for j in range(V, cost - 1, -1):
            # 计算租用k艘该种货船的最大载货量
            for k in range(1, min(count, j // cost) + 1):
                dp[j] = max(dp[j], dp[j - k * cost] + k * capacity)
    
    # 返回在预算为V元时的最大载货量
    return dp[V]

if __name__ == "__main__":
    ships1 = [[2, 3, 2], [3, 2, 10]]
    ships2 = [[5, 10, 20], [2, 20, 30], [3, 15, 25]]
    ships3 = [[10, 5, 50]]
    
    print(solution(2, 10, ships1) == 32)  # True
    print(solution(3, 50, ships2) == 100)  # True
    print(solution(1, 100, ships3) == 500)  # True

测试样例

  • 样例1:预算10元,货船选择如上,输出为 32,表示在10元内能够装满32吨货物。
  • 样例2:预算50元,货船选择如上,输出为 100,表示在50元内能够装满100吨货物。
  • 样例3:预算100元,货船选择如上,输出为 500,表示在100元内能够装满500吨货物。

总结

通过动态规划,我们成功地帮助小S在有限的预算内,租用了能够承载最大货物的货船组合。这个过程就像是在玩一个策略游戏,每一步都需要精心计算,才能达到最佳效果。希望小S的货船租赁大冒险能给你带来一些启发和乐趣!