小S的货船租赁冒险
问题描述
小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
代码
def solution(Q, V, ships):
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):
dp[i][j] = dp[i - 1][j]
for k in range(1, 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]
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)
代码思路
-
问题理解:
- 我们需要在给定的预算
V内,选择不同类型的货船,使得总载货量最大化。 - 每种货船有数量限制
m[i],租赁成本v[i],和最大载货量w[i]。
- 我们需要在给定的预算
-
数据结构选择:
- 使用动态规划(DP)来解决这个问题。
- 定义一个二维数组
dp,其中dp[i][j]表示在前i种货船中,预算为j时的最大载货量。
-
算法步骤:
- 初始化
dp数组,dp[0][j]为 0,表示没有选择任何货船时的最大载货量为 0。 - 对于每一种货船
i,遍历所有可能的预算j:- 对于每种货船
i,再遍历其数量k(从 1 到m[i]):- 如果当前预算
j足够支付k艘货船的租赁成本k * v[i],则更新dp[i][j]为dp[i-1][j-k*v[i]] + k*w[i]和dp[i-1][j]中的较大值。
- 如果当前预算
- 对于每种货船
- 最终答案为
dp[Q][V],即在前Q种货船中,预算为V时的最大载货量。
- 初始化
复杂度分析
-
时间复杂度:
- 外层循环遍历
Q种货船,内层循环遍历预算V,最内层循环遍历每种货船的数量m[i]。 - 因此,时间复杂度为
O(Q * V * Σm[i]),其中Σm[i]是所有货船数量的总和。
- 外层循环遍历
-
空间复杂度:
- 使用了一个二维数组
dp,大小为(Q+1) * (V+1)。 - 因此,空间复杂度为
O(Q * V)。
- 使用了一个二维数组
优化建议
- 如果
Q和V较大,且Σm[i]也非常大,时间复杂度可能会很高。可以考虑使用更高效的算法或数据结构来优化。 - 例如,可以使用滚动数组来优化空间复杂度,或者使用更高级的动态规划技巧来减少时间复杂度。