@@ -67,14 +67,15 @@ $dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrace dp[i
67
67
68
68
``` Python
69
69
class Solution :
70
+ # 思路 1:动态规划 + 二维基本思路
70
71
def zeroOnePackMethod1 (self , weight : [int ], value : [int ], W : int ):
71
72
size = len (weight)
72
73
dp = [[0 for _ in range (W + 1 )] for _ in range (size + 1 )]
73
74
74
75
# 枚举前 i 种物品
75
76
for i in range (1 , size + 1 ):
76
77
# 枚举背包装载重量
77
- for w in range (1 , W + 1 ):
78
+ for w in range (W + 1 ):
78
79
# 第 i - 1 件物品装不下
79
80
if w < weight[i - 1 ]:
80
81
# dp[i][w] 取「前 i - 1 件物品装入载重为 w 的背包中的最大价值」
@@ -137,6 +138,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], dp[w - w
137
138
138
139
``` Python
139
140
class Solution :
141
+ # 思路 2:动态规划 + 滚动数组优化
140
142
def zeroOnePackMethod2 (self , weight : [int ], value : [int ], W : int ):
141
143
size = len (weight)
142
144
dp = [0 for _ in range (W + 1 )]
@@ -232,14 +234,18 @@ $dp[w] = \begin{cases} dp[w] & w < nums[i - 1] \cr max \lbrace dp[w], \quad dp[w
232
234
233
235
``` Python
234
236
class Solution :
237
+ # 思路 2:动态规划 + 滚动数组优化
235
238
def zeroOnePackMethod2 (self , weight : [int ], value : [int ], W : int ):
236
239
size = len (weight)
237
240
dp = [0 for _ in range (W + 1 )]
238
241
242
+ # 枚举前 i 种物品
239
243
for i in range (1 , size + 1 ):
244
+ # 逆序枚举背包装载重量(避免状态值错误)
240
245
for w in range (W, weight[i - 1 ] - 1 , - 1 ):
246
+ # dp[w] 取「前 i - 1 件物品装入载重为 w 的背包中的最大价值」与「前 i - 1 件物品装入载重为 w - weight[i - 1] 的背包中,再装入第 i - 1 物品所得的最大价值」两者中的最大值
241
247
dp[w] = max (dp[w], dp[w - weight[i - 1 ]] + value[i - 1 ])
242
-
248
+
243
249
return dp[W]
244
250
245
251
def canPartition (self , nums : List[int ]) -> bool :
@@ -248,7 +254,7 @@ class Solution:
248
254
return False
249
255
250
256
target = sum_nums // 2
251
- return self .zeroOnePackOptimization (nums, nums, target) == target
257
+ return self .zeroOnePackMethod2 (nums, nums, target) == target
252
258
```
253
259
254
260
##### 思路 1:复杂度分析
0 commit comments