解题思路
-
问题理解:
- 你需要在给定的预算
V内,选择不同类型的货船,使得总载货量最大。 - 每种货船有数量限制
m[i],租赁成本v[i],和载货量w[i]。
- 你需要在给定的预算
-
数据结构选择:
- 使用动态规划(Dynamic Programming, DP)来解决这个问题。
- 定义一个二维数组
dp[i][j],表示在前i种货船中,花费不超过j元时能获得的最大载货量。
-
算法步骤:
- 初始化
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 函数中实现具体的逻辑。以下是一些关键步骤的提示:
-
初始化
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]