Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 62f1751

Browse files
committed
Update 01.Knapsack-Problem-01.md
1 parent ccf5054 commit 62f1751

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

‎Contents/10.Dynamic-Programming/04.Knapsack-Problem/01.Knapsack-Problem-01.md‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,15 @@ $dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrace dp[i
6767

6868
```Python
6969
class Solution:
70+
# 思路 1:动态规划 + 二维基本思路
7071
def zeroOnePackMethod1(self, weight: [int], value: [int], W: int):
7172
size = len(weight)
7273
dp = [[0 for _ in range(W + 1)] for _ in range(size + 1)]
7374

7475
# 枚举前 i 种物品
7576
for i in range(1, size + 1):
7677
# 枚举背包装载重量
77-
for w in range(1, W + 1):
78+
for w in range(W + 1):
7879
# 第 i - 1 件物品装不下
7980
if w < weight[i - 1]:
8081
# 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
137138

138139
```Python
139140
class Solution:
141+
# 思路 2:动态规划 + 滚动数组优化
140142
def zeroOnePackMethod2(self, weight: [int], value: [int], W: int):
141143
size = len(weight)
142144
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
232234

233235
```Python
234236
class Solution:
237+
# 思路 2:动态规划 + 滚动数组优化
235238
def zeroOnePackMethod2(self, weight: [int], value: [int], W: int):
236239
size = len(weight)
237240
dp = [0 for _ in range(W + 1)]
238241

242+
# 枚举前 i 种物品
239243
for i in range(1, size + 1):
244+
# 逆序枚举背包装载重量(避免状态值错误)
240245
for w in range(W, weight[i - 1] - 1, -1):
246+
# dp[w] 取「前 i - 1 件物品装入载重为 w 的背包中的最大价值」与「前 i - 1 件物品装入载重为 w - weight[i - 1] 的背包中,再装入第 i - 1 物品所得的最大价值」两者中的最大值
241247
dp[w] = max(dp[w], dp[w - weight[i - 1]] + value[i - 1])
242-
248+
243249
return dp[W]
244250

245251
def canPartition(self, nums: List[int]) -> bool:
@@ -248,7 +254,7 @@ class Solution:
248254
return False
249255

250256
target = sum_nums // 2
251-
return self.zeroOnePackOptimization(nums, nums, target) == target
257+
return self.zeroOnePackMethod2(nums, nums, target) == target
252258
```
253259

254260
##### 思路 1:复杂度分析

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /