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 #74

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 18 commits into AlgorithmAndLeetCode:main from itcharge:main
Mar 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
d191c89
Update Pack-ProblemVariants.py
itcharge Mar 28, 2023
d122b5b
Update 04.Knapsack-Problem-04.md
itcharge Mar 28, 2023
6c94cc0
Update Pack-ProblemVariants.py
itcharge Mar 28, 2023
6782bc4
Create Pack-MixedPack.py
itcharge Mar 28, 2023
e7d5a47
Update 04.Knapsack-Problem-04.md
itcharge Mar 28, 2023
626f88f
Create 05.Knapsack-Problem-05.md
itcharge Mar 28, 2023
91e382d
Create 06.Knapsack-Problem-List.md
itcharge Mar 28, 2023
50a1b03
Update 01.Knapsack-Problem-01.md
itcharge Mar 28, 2023
e55f633
Update 02.Knapsack-Problem-02.md
itcharge Mar 28, 2023
d758676
Update 03.Knapsack-Problem-03.md
itcharge Mar 28, 2023
b280e74
Update 04.Knapsack-Problem-04.md
itcharge Mar 28, 2023
1586ce9
Update 05.Knapsack-Problem-05.md
itcharge Mar 28, 2023
7ff6bf9
Delete 05.Knapsack-Problem-List.md
itcharge Mar 28, 2023
f331c22
Update Pack-ProblemVariants.py
itcharge Mar 28, 2023
9892e44
Update 01.Knapsack-Problem-01.md
itcharge Mar 28, 2023
294e477
Update Categories-List.md
itcharge Mar 29, 2023
b0afdc1
Update README-Catalogue-List.md
itcharge Mar 29, 2023
21b9e37
更新目录列表链接
itcharge Mar 29, 2023
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
2 changes: 1 addition & 1 deletion Assets/Origins/Categories-List.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@

###### 1137. 第 N 个泰波那契数、0650. 只有两个键的键盘、0264. 丑数 II、0279. 完全平方数、0343. 整数拆分

### [背包问题题目](../../Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-List.md)
### [背包问题题目](../../Contents/10.Dynamic-Programming/04.Knapsack-Problem/06.Knapsack-Problem-List.md)

#### 0-1 背包问题

Expand Down
3 changes: 2 additions & 1 deletion Assets/Origins/README-Catalogue-List.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@
- [背包问题知识(二)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/04.Knapsack-Problem/02.Knapsack-Problem-02.md)
- [背包问题知识(三)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/04.Knapsack-Problem/03.Knapsack-Problem-03.md)
- [背包问题知识(四)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/04.Knapsack-Problem/04.Knapsack-Problem-04.md)
- [背包问题题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-List.md)
- [背包问题知识(五)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-05.md)
- [背包问题题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/04.Knapsack-Problem/06.Knapsack-Problem-List.md)
- 区间 DP
- [区间 DP 知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/05.Interval-DP/01.Interval-DP.md)
- [区间 DP 题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/05.Interval-DP/02.Interval-DP-List.md)
Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ $dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrace dp[i

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0$。
- 前 0ドル$ 件物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 件物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -128,7 +128,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], dp[w - w

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[0] = 0$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -222,7 +222,7 @@ $dp[w] = \begin{cases} dp[w] & w < nums[i - 1] \cr max \lbrace dp[w], \quad dp[w

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么元素,可以获得的元素和一定是 0ドル,ドル即 $dp[0] = 0$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -266,3 +266,5 @@ class Solution:

- 【资料】[背包九讲 - 崔添翼](https://github.com/tianyicui/pack)
- 【文章】[背包 DP - OI Wiki](https://oi-wiki.org/dp/knapsack/)
- 【文章】[背包问题 第四讲 - 宫水三叶的刷题日记](https://juejin.cn/post/7003243733604892685)
- 【文章】[Massive Algorithms: 讲透完全背包算法](https://massivealgorithms.blogspot.com/2015/06/unbounded-knapsack-problem.html)
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ $dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0$。
- 前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -133,8 +133,8 @@ $\quad dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrac

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0$。
- 前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -201,7 +201,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], \quad d

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[0] = 0$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -300,11 +300,15 @@ $dp[c] = \begin{cases} dp[c] & c < coins[i - 1] \cr min \lbrace dp[c], dp[c - co
###### 4. 初始条件

- 凑成总金额为 0ドル$ 的最少硬币数量为 0ドル,ドル即 $dp[0] = 0$。
- 默认凑成总金额为 $w$ 的最少硬币数量为一个极大值(比如 $amount + 1$),表示无法凑成。

###### 5. 最终结果

根据我们之前定义的状态,$dp[c]$ 表示为:凑成总金额为 $c$ 的最少硬币数量。则最终结果为 $dp[amount]$。

1. 如果 $dp[amount] \ne amount + 1,ドル则说明: $dp[amount]$ 为凑成金额 $amount$ 的最少硬币数量,则返回 $dp[amount]$。
2. 如果 $dp[amount] = amount + 1,ドル则说明:无法凑成金额 $amount,ドル则返回 $-1$。

##### 思路 1:代码

```Python
Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ $dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0$。
- 前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -83,7 +83,7 @@ $dp[w] = max \lbrace dp[w - k \times weight[i - 1]] + k \times value[i - 1] \rbr

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[0] = 0$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -159,7 +159,7 @@ $dp[w] = max \lbrace dp[w - weight \underline{ } new[i - 1]] + value \underline{

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[0] = 0$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -1,10 +1,88 @@


## 5. 分组背包问题
## 5. 混合背包问题

> **混合背包问题**:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i],ドル价值为 $value[i],ドル件数为 $count[i]$。其中:
>
> 1. 当 $count[i] = -1$ 时,代表该物品只有 1ドル$ 件。
> 2. 当 $count[i] = 0$ 时,代表该物品有无限件。
> 3. 当 $count[i] > 0$ 时,代表该物品有 $count[i]$ 件。
>
> 请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值是多少?

#### 思路 1:动态规划

混合背包问题其实就是将「0-1 背包问题」、「完全背包问题」和「多重背包问题」这 3ドル$ 种背包问题综合起来,有的是能取 1ドル$ 件,有的能取无数件,有的只能取 $count[i]$ 件。

其实只要理解了之前讲解的这 3ドル$ 种背包问题的核心思想,只要将其合并在一起就可以了。

并且在「多重背包问题」中,我们曾经使用「二进制优化」的方式,将「多重背包问题」转换为「0-1 背包问题」,那么在解决「混合背包问题」时,我们也可以先将「多重背包问题」转换为「0-1 背包问题」,然后直接再区分是「0-1 背包问题」还是「完全背包问题」就可以了。

#### 思路 1:代码

```Python
class Solution:
def mixedPackMethod1(self, weight: [int], value: [int], count: [int], W: int):
weight_new, value_new, count_new = [], [], []

# 二进制优化
for i in range(len(weight)):
cnt = count[i]
# 多重背包问题,转为 0-1 背包问题
if cnt > 0:
k = 1
while k <= cnt:
cnt -= k
weight_new.append(weight[i] * k)
value_new.append(value[i] * k)
count_new.append(1)
k *= 2
if cnt > 0:
weight_new.append(weight[i] * cnt)
value_new.append(value[i] * cnt)
count_new.append(1)
# 0-1 背包问题,直接添加
elif cnt == -1:
weight_new.append(weight[i])
value_new.append(value[i])
count_new.append(1)
# 完全背包问题,标记并添加
else:
weight_new.append(weight[i])
value_new.append(value[i])
count_new.append(0)

dp = [0 for _ in range(W + 1)]
size = len(weight_new)

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

return dp[W]
```

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

- **时间复杂度**:$O(W \times \sum \log_2{count[i]}),ドル其中 $W$ 为背包的载重上限,$count[i]$ 是第 $i$ 种物品的数量。
- **空间复杂度**:$O(W)$。

## 6. 分组背包问题

> **分组背包问题**:有 $n$ 组物品和一个最多能装重量为 $W$ 的背包,第 $i$ 组物品的件数为 $group\underline{}count[i],ドル第 $i$ 组的第 $j$ 个物品重量为 $weight[i][j],ドル价值为 $value[i][j]$。每组物品中最多只能选择 1ドル$ 件物品装入背包。请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值是多少?

### 5.1 分组背包问题基本思路
### 6.1 分组背包问题基本思路

#### 思路 1:动态规划 + 二维基本思路

Expand Down Expand Up @@ -34,8 +112,8 @@ $dp[i][w] = max \lbrace dp[i - 1][w],dp[i - 1][w - weight[i - 1][k]] + value[i

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0$。
- 前 0ドル$ 组物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 组物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -67,7 +145,7 @@ class Solution:
- **时间复杂度**:$O(n \times W \times C),ドル其中 $n$ 为物品分组数量,$W$ 为背包的载重上限,$C$ 是每组物品的数量。因为 $n \times C = \sum group\underline{}count[i],ドル所以时间复杂度也可以写成 $O(W \times \sum group\underline{}count[i])$。
- **空间复杂度**:$O(n \times W)$。

### 5.2 分组背包问题滚动数组优化
### 6.2 分组背包问题滚动数组优化

#### 思路 2:动态规划 + 滚动数组优化

Expand All @@ -85,7 +163,7 @@ $dp[w] = max \lbrace dp[w], \quad dp[w - weight[i - 1][k]] + value[i - 1][k] \r

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[0] = 0$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -118,11 +196,11 @@ class Solution:
- **时间复杂度**:$O(n \times W \times C),ドル其中 $n$ 为物品分组数量,$W$ 为背包的载重上限,$C$ 是每组物品的数量。因为 $n \times C = \sum group\underline{}count[i],ドル所以时间复杂度也可以写成 $O(W \times \sum group\underline{}count[i])$。
- **空间复杂度**:$O(W)$。

## 6. 二维费用背包问题
## 7. 二维费用背包问题

> **二维费用背包问题**:有 $n$ 件物品和有一个最多能装重量为 $W$、容量为 $V$ 的背包。第 $i$ 件物品的重量为 $weight[i],ドル体积为 $volume[i],ドル价值为 $value[i],ドル每件物品有且只有 1ドル$ 件。请问在总重量不超过背包载重上限、容量上限的情况下,能装入背包的最大价值是多少?

### 6.1 二维费用背包问题基本思路
### 7.1 二维费用背包问题基本思路

我们可以参考「0-1 背包问题」的状态定义和基本思路,在「0-1 背包问题」基本思路的基础上,增加一个维度用于表示物品的容量。

Expand All @@ -144,8 +222,13 @@ $dp[i][w][v] = max(dp[i - 1][w][v], dp[i - 1][w - weight[i - 1]][v - volume[i -

###### 4. 初始条件

- 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0][v] = 0,dp[i][w][0] = 0$。
- 前 0ドル$ 组物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w][v] = 0$。
- 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即:
- $dp[i][w][0] = 0,0 \le i \le size,0 \le w \le W$
- $dp[i][0][v] = 0,0 \le i \le size,0 \le v \le V$

- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即:
- $dp[0][w][v] = 0,0 \le w \le W,0 \le v \le V$


###### 5. 最终结果

Expand Down Expand Up @@ -182,7 +265,7 @@ class Solution:
- **时间复杂度**:$O(n \times W \times V),ドル其中 $n$ 为物品分组数量,$W$ 为背包的载重上限,$V$ 为背包的容量上限。
- **空间复杂度**:$O(n \times W \times V)$。

### 6.2 二维费用背包问题滚动数组优化
### 7.2 二维费用背包问题滚动数组优化

#### 思路 2:动态规划 + 滚动数组优化

Expand All @@ -200,7 +283,10 @@ $dp[w][v] = max \lbrace dp[w][v], \quad dp[w - weight[i - 1]][v - volume[i - 1]]

###### 4. 初始条件

- 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w][0] = 0,dp[0][v] = 0$。
- 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即:
- $dp[w][0] = 0,0 \le w \le W$
- $dp[0][v] = 0,0 \le v \le V$


###### 5. 最终结果

Expand Down Expand Up @@ -232,59 +318,9 @@ class Solution:
- **时间复杂度**:$O(n \times W \times V),ドル其中 $n$ 为物品分组数量,$W$ 为背包的载重上限,$V$ 为背包的容量上限。
- **空间复杂度**:$O(W \times V)$。

## 7. 背包问题变种

### 7.1 背包问题求方案总数

> **背包问题求方案数**:在给定背包重量 $W,ドル每件物品重量 $weight[i],ドル物品间相互关系(分组、依赖等)的背包问题中。求解出装满背包或将背包装至某一指定重量的方案总数。

这种问题就是将原有状态转移方程中的「求最大值」变为「求和」即可。我们以「完全背包问题」求解方案总数为例。

> **完全背包问题求解方案数**:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i],ドル价值为 $value[i],ドル每种物品数量没有限制。请问装满重量为 $W$ 的背包,一共有多少种方案。

如果使用二维状态定义,可定义状态 $dp[i][w]$ 为:前 $i$ 种物品放入一个最多能装重量为 $w$ 的背包中,一共有多少种方案。

则状态转移方程为:$dp[i][w] = sum(dp[i - 1][w], \quad dp[i][w - weight[i - 1]])$。

如果进行滚动数组优化中,使用一位状态定义,可定义状态 $dp[w]$ 为:装满重量为 $w$ 的背包的方案总数。则状态转移方程为:$dp[w] = sum(dp[w], \quad dp[w - weight[i - 1]])$。

###### 1. 划分阶段

按照物品种类的序号、当前背包的载重上限进行阶段划分。

###### 2. 定义状态

定义状态 $dp[w]$ 表示为:将物品装入最多能装重量为 $w$ 的背包中的方案总数。

###### 3. 状态转移方程

$dp[w] = sum \lbrace dp[w], \quad dp[w - weight[i - 1]] \rbrace $

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则一共有 1ドル$ 种方案(什么也不装),即 $dp[0] = 1$。

###### 5. 最终结果

根据我们之前定义的状态, $dp[w]$ 表示为:将物品装入最多能装重量为 $w$ 的背包中的方案总数。则最终结果为 $dp[W],ドル其中 $W$ 为背包的载重上限。

#### 思路 1:代码

```Python

```

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

- **时间复杂度**:$O(n \times W),ドル其中 $n$ 为物品种类数量,$W$ 为背包的载重上限。
- **空间复杂度**:$O(W)$。

### 7.2 背包问题求最优方案数

### 7.3 背包问题输出方案

## 参考资料

- 【资料】[背包九讲 - 崔添翼](https://github.com/tianyicui/pack)
- 【文章】[背包 DP - OI Wiki](https://oi-wiki.org/dp/knapsack/)
- 【文章】[【动态规划/背包问题】分组背包问题](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247487504&idx=1&sn=9ac523ec0ac14c8634a229f8c3f919d7&chksm=fd9cbb0fcaeb32196b80a40e4408f6a7e2651167e0b9e31aa6d7c6109fbc2117340a59db12a1&scene=178&cur_album_id=1751702161341628417#rd)
- 【文章】[【动态规划/背包问题】分组背包问题](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247487504&idx=1&sn=9ac523ec0ac14c8634a229f8c3f919d7&chksm=fd9cbb0fcaeb32196b80a40e4408f6a7e2651167e0b9e31aa6d7c6109fbc2117340a59db12a1&token=1936267333&lang=zh_CN&scene=21#wechat_redirect)
- 【文章】[【动态规划/背包问题】背包问题第一阶段最终章:混合背包问题](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247487034&idx=1&sn=eaa05b76387d34aa77f7f14f35fa78a4&chksm=fd9ca525caeb2c33095d285222dcee0dd072465bf7288bda0aab39e90a04bb7b1af018b89fd4&token=1872331648&lang=zh_CN&scene=21#wechat_redirect)
Loading

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