问题描述
小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数组:
dp[budget]表示在预算为budget时,能够租用的最大总载货量。
算法步骤
-
初始化DP数组:
dp = [0] * (V + 1),表示在预算为budget时,能够租用的最大总载货量为dp[budget]。 -
遍历每种货船:对于每种货船
[m, v, w],其中m是数量,v是租赁成本,w是最大载货量。 -
更新DP数组:
- 对于每个预算
budget,从V到v逆序遍历,这样可以避免重复计算。 - 计算当前预算下最多能租用的数量
max_count = min(m, budget // v)。 - 对于每个可能的租用数量
k,更新dp[budget]为max(dp[budget], dp[budget - k * v] + k * w)。
- 对于每个预算
-
返回结果:最终结果为
dp[V],即在预算为V时的最大总载货量。
总结
通过动态规划,我们可以有效地解决这个问题。关键在于正确地更新DP数组,确保每个预算下的最大载货量都被正确计算。
代码实现
def solution(Q, V, ships):
dp = [0] * (V + 1)
for m, v, w in ships:
# 对每种船进行多重背包
for budget in range(V, v - 1, -1):
# 处理当前预算下的多重选择
max_count = min(m, budget // v) # 最多能租用的数量
for k in range(1, max_count + 1):
dp[budget] = max(dp[budget], dp[budget - k * v] + k * w)
return dp[V]
if __name__ == "__main__":
# You can add more test cases here
ships = [[2, 3, 2], [3, 2, 10]]
ships2 = [[30, 141, 47], [9, 258, 12], [81, 149, 13], [91, 236, 6], [27, 163, 74], [34, 13, 58], [61, 162, 1], [80, 238, 29], [36, 264, 28], [36, 250, 2], [70, 214, 31], [39, 116, 39], [83, 287, 4], [61, 269, 94], [23, 187, 46], [78, 33, 29], [46, 151, 2], [71, 249, 1], [67, 76, 85], [72, 239, 17], [61, 256, 49], [48, 216, 73], [39, 49, 74]]
print(solution(2, 10, ships) == 32)
print(solution(23, 400, ships2) == 1740)
我们就成功通过了本题🤩
本次我们通过《小S的货船租赁冒险》这道题目的解决过程展示了豆包MarsCode AI刷题平台的几个显著亮点:
- 算法推荐与指导:当用户在解决问题时遇到瓶颈,例如不知道如何有效统计特定范围内的二进制数中1的个数之和时,AI能够提供具体的算法建议,并给出详细的算法流程、伪代码及实现代码,极大地降低了学习和解决问题的门槛。
- 多语言支持与代码转换:虽然豆包MarsCode AI刷题平台可能最初只提供了某些编程语言的支持,但它具备强大的跨语言代码转换功能,可以将用户的C++代码转换成Java或Python等其他语言的等效代码。这一特性对于那些需要在不同语言环境间切换的开发者来说非常有用,确保了用户能够在任何平台上顺利提交解决方案。
- 实践性与即时反馈:通过实际编写代码并测试示例输入输出,用户可以在提交之前验证自己的解答是否正确。这种即时的反馈机制有助于加深理解,及时调整错误,提高学习效率。 通过豆包MarsCode AI刷题平台,我们可以看到AI刷题的强大之处,它不仅向我们提供思路提示,更给我们提供代码框架,我们需要做的就是往框架里面填写代码并添加一些自己的思考,这极大程度地提高了我们编写代码的效率,同时也拓宽了我们编写代码的思路。跟随AI刷题的步伐,我们的写代码的能力也会越来越强。豆包MarsCode AI刷题工具通过精选真题与个性化推荐功能,帮助我高效地掌握了复杂的算法知识,也提升了我的自学能力,是我学习过程中的得力助手。 综上所述,豆包MarsCode AI刷题平台具有精准的算法指导、灵活的多语言支持以及即时的实践反馈,为用户提供了一个高效、便捷且富有成效的学习环境。
好了,那么我们这一次的解析就到这里,后面会给大家展示豆包MarsCode AI刷题的更多功能