mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-05 11:41:22 +08:00
build
This commit is contained in:
@@ -17,6 +17,8 @@ status: new
|
||||
|
||||
<p align="center"> 图:完全背包问题的示例数据 </p>
|
||||
|
||||
### 1. 动态规划思路
|
||||
|
||||
完全背包和 0-1 背包问题非常相似,**区别仅在于不限制物品的选择次数**。
|
||||
|
||||
- 在 0-1 背包中,每个物品只有一个,因此将物品 $i$ 放入背包后,只能从前 $i-1$ 个物品中选择。
|
||||
@@ -33,7 +35,7 @@ $$
|
||||
dp[i, c] = \max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1])
|
||||
$$
|
||||
|
||||
### 代码实现
|
||||
### 2. 代码实现
|
||||
|
||||
对比两道题目的代码,状态转移中有一处从 $i-1$ 变为 $i$ ,其余完全一致。
|
||||
|
||||
@@ -270,7 +272,7 @@ $$
|
||||
}
|
||||
```
|
||||
|
||||
### 状态压缩
|
||||
### 3. 状态压缩
|
||||
|
||||
由于当前状态是从左边和上边的状态转移而来,**因此状态压缩后应该对 $dp$ 表中的每一行采取正序遍历**。
|
||||
|
||||
@@ -541,6 +543,8 @@ $$
|
||||
|
||||
<p align="center"> 图:零钱兑换问题的示例数据 </p>
|
||||
|
||||
### 1. 动态规划思路
|
||||
|
||||
**零钱兑换可以看作是完全背包的一种特殊情况**,两者具有以下联系与不同点:
|
||||
|
||||
- 两道题可以相互转换,“物品”对应于“硬币”、“物品重量”对应于“硬币面值”、“背包容量”对应于“目标金额”。
|
||||
@@ -570,7 +574,7 @@ $$
|
||||
|
||||
当无硬币时,**无法凑出任意 $> 0$ 的目标金额**,即是无效解。为使状态转移方程中的 $\min()$ 函数能够识别并过滤无效解,我们考虑使用 $+ \infty$ 来表示它们,即令首行所有 $dp[0, a]$ 都等于 $+ \infty$ 。
|
||||
|
||||
### 代码实现
|
||||
### 2. 代码实现
|
||||
|
||||
大多数编程语言并未提供 $+ \infty$ 变量,只能使用整型 `int` 的最大值来代替。而这又会导致大数越界:状态转移方程中的 $+ 1$ 操作可能发生溢出。
|
||||
|
||||
@@ -911,7 +915,7 @@ $$
|
||||
|
||||
<p align="center"> 图:零钱兑换问题的动态规划过程 </p>
|
||||
|
||||
### 状态压缩
|
||||
### 3. 状态压缩
|
||||
|
||||
零钱兑换的状态压缩的处理方式和完全背包一致。
|
||||
|
||||
@@ -1188,6 +1192,8 @@ $$
|
||||
|
||||
<p align="center"> 图:零钱兑换问题 II 的示例数据 </p>
|
||||
|
||||
### 1. 动态规划思路
|
||||
|
||||
相比于上一题,本题目标是组合数量,因此子问题变为:**前 $i$ 种硬币能够凑出金额 $a$ 的组合数量**。而 $dp$ 表仍然是尺寸为 $(n+1) \times (amt + 1)$ 的二维矩阵。
|
||||
|
||||
当前状态的组合数量等于不选当前硬币与选当前硬币这两种决策的组合数量之和。状态转移方程为:
|
||||
@@ -1198,7 +1204,7 @@ $$
|
||||
|
||||
当目标金额为 $0$ 时,无需选择任何硬币即可凑出目标金额,因此应将首列所有 $dp[i, 0]$ 都初始化为 $1$ 。当无硬币时,无法凑出任何 $>0$ 的目标金额,因此首行所有 $dp[0, a]$ 都等于 $0$ 。
|
||||
|
||||
### 代码实现
|
||||
### 2. 代码实现
|
||||
|
||||
=== "Java"
|
||||
|
||||
@@ -1468,7 +1474,7 @@ $$
|
||||
}
|
||||
```
|
||||
|
||||
### 状态压缩
|
||||
### 3. 状态压缩
|
||||
|
||||
状态压缩处理方式相同,删除硬币维度即可。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user