1
+ class Solution :
2
+ # 思路 1:动态规划 + 三维基本思路
3
+ def twoDCostPackMethod1 (self , weight : [int ], volume : [int ], value : [int ], W : int , V : int ):
4
+ size = len (weight )
5
+ dp = [[[0 for _ in range (V + 1 )] for _ in range (W + 1 )] for _ in range (size + 1 )]
6
+
7
+ # 枚举前 i 组物品
8
+ for i in range (1 , N + 1 ):
9
+ # 枚举背包装载重量
10
+ for w in range (W + 1 ):
11
+ # 枚举背包装载容量
12
+ for v in range (V + 1 ):
13
+ # 第 i - 1 件物品装不下
14
+ if w < weight [i - 1 ] or v < volume [i - 1 ]:
15
+ # dp[i][w][v] 取「前 i - 1 件物品装入装载重量为 w、装载容量为 v 的背包中的最大价值」
16
+ dp [i ][w ][v ] = dp [i - 1 ][w ][v ]
17
+ else :
18
+ # dp[i][w][v] 取所有 dp[w - weight[i - 1]][v - volume[i - 1]] + value[i - 1] 中最大值
19
+ dp [i ][w ][v ] = max (dp [i - 1 ][w ][v ], dp [i - 1 ][w - weight [i - 1 ]][v - volume [i - 1 ]] + value [i - 1 ])
20
+
21
+ return dp [size ][W ][V ]
22
+
23
+ # 思路 2:动态规划 + 滚动数组优化
24
+ def twoDCostPackMethod2 (self , weight : [int ], volume : [int ], value : [int ], W : int , V : int ):
25
+ size = len (weight )
26
+ dp = [[0 for _ in range (V + 1 )] for _ in range (W + 1 )]
27
+
28
+ # 枚举前 i 组物品
29
+ for i in range (1 , N + 1 ):
30
+ # 逆序枚举背包装载重量
31
+ for w in range (W , weight [i - 1 ] - 1 , - 1 ):
32
+ # 逆序枚举背包装载容量
33
+ for v in range (V , volume [i - 1 ] - 1 , - 1 ):
34
+ # dp[w][v] 取所有 dp[w - weight[i - 1]][v - volume[i - 1]] + value[i - 1] 中最大值
35
+ dp [w ][v ] = max (dp [w ][v ], dp [w - weight [i - 1 ]][v - volume [i - 1 ]] + value [i - 1 ])
36
+
37
+ return dp [W ][V ]
0 commit comments