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

[pull] main from itcharge:main #72

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
pull merged 7 commits into AlgorithmAndLeetCode:main from itcharge:main
Mar 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,15 @@ $dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrace dp[i

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

# 枚举前 i 种物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(1, W + 1):
for w in range(W + 1):
# 第 i - 1 件物品装不下
if w < weight[i - 1]:
# dp[i][w] 取「前 i - 1 件物品装入载重为 w 的背包中的最大价值」
Expand Down Expand Up @@ -137,6 +138,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], dp[w - w

```Python
class Solution:
# 思路 2:动态规划 + 滚动数组优化
def zeroOnePackMethod2(self, weight: [int], value: [int], W: int):
size = len(weight)
dp = [0 for _ in range(W + 1)]
Expand Down Expand Up @@ -232,14 +234,18 @@ $dp[w] = \begin{cases} dp[w] & w < nums[i - 1] \cr max \lbrace dp[w], \quad dp[w

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

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

return dp[W]

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

target = sum_nums // 2
return self.zeroOnePackOptimization(nums, nums, target) == target
return self.zeroOnePackMethod2(nums, nums, target) == target
```

##### 思路 1:复杂度分析
Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,15 @@ $dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i

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

# 枚举前 i 种物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(1, W + 1):
for w in range(W + 1):
# 枚举第 i 种物品能取个数
for k in range(w // weight[i - 1] + 1):
# dp[i][w] 取所有 dp[i - 1][w - k * weight[i - 1] + k * value[i - 1] 中最大值
Expand Down Expand Up @@ -142,15 +143,16 @@ $\quad dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrac
#### 思路 2:代码

```Python
class Solution:
class Solution:
# 思路 2:动态规划 + 状态转移方程优化
def completePackMethod2(self, weight: [int], value: [int], W: int):
size = len(weight)
dp = [[0 for _ in range(W + 1)] for _ in range(size + 1)]

# 枚举前 i 种物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(1, W + 1):
for w in range(W + 1):
# 第 i - 1 件物品装不下
if w < weight[i - 1]:
# dp[i][w] 取「前 i - 1 种物品装入载重为 w 的背包中的最大价值」
Expand Down Expand Up @@ -209,6 +211,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], \quad d

```Python
class Solution:
# 思路 3:动态规划 + 滚动数组优化
def completePackMethod3(self, weight: [int], value: [int], W: int):
size = len(weight)
dp = [0 for _ in range(W + 1)]
Expand Down
9 changes: 6 additions & 3 deletions Solutions/0416. 分割等和子集.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,17 @@ $dp[w] = \begin{cases} dp[w] & w < nums[i - 1] \cr max \lbrace dp[w], dp[w - num

```Python
class Solution:
def zeroOnePackOptimization(self, weight: [int], value: [int], W: int):
def zeroOnePack(self, weight: [int], value: [int], W: int):
size = len(weight)
dp = [0 for _ in range(W + 1)]

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

return dp[W]

def canPartition(self, nums: List[int]) -> bool:
Expand All @@ -89,7 +92,7 @@ class Solution:
return False

target = sum_nums // 2
return self.zeroOnePackOptimization(nums, nums, target) == target
return self.zeroOnePack(nums, nums, target) == target
```

### 思路 1:复杂度分析
Expand Down
4 changes: 2 additions & 2 deletions Templates/10.Dynamic-Programming/Pack-CompletePack.py
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def completePackMethod1(self, weight: [int], value: [int], W: int):
# 枚举前 i 种物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(1, W + 1):
for w in range(W + 1):
# 枚举第 i 种物品能取个数
for k in range(w // weight[i - 1] + 1):
# dp[i][w] 取所有 dp[i - 1][w - k * weight[i - 1] + k * value[i - 1] 中最大值
Expand All @@ -23,7 +23,7 @@ def completePackMethod2(self, weight: [int], value: [int], W: int):
# 枚举前 i 种物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(1, W + 1):
for w in range(W + 1):
# 第 i - 1 件物品装不下
if w < weight[i - 1]:
# dp[i][w] 取「前 i - 1 种物品装入载重为 w 的背包中的最大价值」
Expand Down
37 changes: 37 additions & 0 deletions Templates/10.Dynamic-Programming/Pack-GroupPack.py
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
class Solution:
# 思路 1:动态规划 + 二维基本思路
def groupPackMethod1(self, group_count: [int], weight: [[int]], value: [[int]], W: int):
size = len(group_count)
dp = [[0 for _ in range(W + 1)] for _ in range(size + 1)]

# 枚举前 i 组物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(W + 1):
# 枚举第 i 组物品能取个数
dp[i][w] = dp[i - 1][w]
for k in range(group_count[i - 1]):
if w >= weight[i - 1][k]:
# dp[i][w] 取所有 dp[i - 1][w - weight[i - 1][k]] + value[i - 1][k] 中最大值
dp[i][w] = max(dp[i][w], dp[i - 1][w - weight[i - 1][k]] + value[i - 1][k])

return dp[size][W]

# 思路 2:动态规划 + 滚动数组优化
def groupPackMethod2(self, group_count: [int], weight: [[int]], value: [[int]], W: int):
size = len(group_count)
dp = [0 for _ in range(W + 1)]

# 枚举前 i 组物品
for i in range(1, size + 1):
# 逆序枚举背包装载重量
for w in range(W, -1, -1):
# 枚举第 i 组物品能取个数
for k in range(group_count[i - 1]):
if w >= weight[i - 1][k]:
# dp[i][w] 取所有 dp[i - 1][w - weight[i - 1][k]] + value[i - 1][k] 中最大值
dp[w] = max(dp[w], dp[w - weight[i - 1][k]] + value[i - 1][k])

return dp[W]


3 changes: 2 additions & 1 deletion Templates/10.Dynamic-Programming/Pack-MultiplePack.py
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def multiplePackMethod1(self, weight: [int], value: [int], count: [int], W: int)
# 枚举前 i 种物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(1, W + 1):
for w in range(W + 1):
# 枚举第 i 种物品能取个数
for k in range(min(count[i - 1], w // weight[i - 1]) + 1):
# dp[i][w] 取所有 dp[i - 1][w - k * weight[i - 1] + k * value[i - 1] 中最大值
Expand Down Expand Up @@ -35,6 +35,7 @@ def multiplePackMethod2(self, weight: [int], value: [int], count: [int], W: int)
def multiplePackMethod3(self, weight: [int], value: [int], count: [int], W: int):
weight_new, value_new = [], []

# 二进制优化
for i in range(len(weight)):
cnt = count[i]
k = 1
Expand Down
2 changes: 1 addition & 1 deletion Templates/10.Dynamic-Programming/Pack-ZeroOnePack.py
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def zeroOnePackMethod1(self, weight: [int], value: [int], W: int):
# 枚举前 i 种物品
for i in range(1, size + 1):
# 枚举背包装载重量
for w in range(1, W + 1):
for w in range(W + 1):
# 第 i - 1 件物品装不下
if w < weight[i - 1]:
# dp[i][w] 取「前 i - 1 件物品装入载重为 w 的背包中的最大价值」
Expand Down

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