mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 15:09:40 +08:00
更改排版
This commit is contained in:
@ -151,13 +151,13 @@ if (abs(target) > sum) return 0; // 此时没有方案
|
|||||||
|
|
||||||
本题则是装满有几种方法。其实这就是一个组合问题了。
|
本题则是装满有几种方法。其实这就是一个组合问题了。
|
||||||
|
|
||||||
1. 确定dp数组以及下标的含义
|
#### 1. 确定dp数组以及下标的含义
|
||||||
|
|
||||||
先用 二维 dp数组求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。
|
先用 二维 dp数组求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。
|
||||||
|
|
||||||
01背包为什么这么定义dp数组,我在[0-1背包理论基础](https://www.programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html)中 确定dp数组的含义里讲解过。
|
01背包为什么这么定义dp数组,我在[0-1背包理论基础](https://www.programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html)中 确定dp数组的含义里讲解过。
|
||||||
|
|
||||||
2. 确定递推公式
|
#### 2. 确定递推公式
|
||||||
|
|
||||||
我们先手动推导一下,这个二维数组里面的数值。
|
我们先手动推导一下,这个二维数组里面的数值。
|
||||||
|
|
||||||
@ -264,7 +264,7 @@ if (nums[i] > j) dp[i][j] = dp[i - 1][j];
|
|||||||
else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];
|
else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];
|
||||||
```
|
```
|
||||||
|
|
||||||
3. dp数组如何初始化
|
#### 3. dp数组如何初始化
|
||||||
|
|
||||||
先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。
|
先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。
|
||||||
|
|
||||||
@ -315,7 +315,7 @@ for (int i = 0; i < nums.size(); i++) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
4. 确定遍历顺序
|
#### 4. 确定遍历顺序
|
||||||
|
|
||||||
在明确递推方向时,我们知道 当前值 是由上方和左上方推出。
|
在明确递推方向时,我们知道 当前值 是由上方和左上方推出。
|
||||||
|
|
||||||
@ -360,7 +360,7 @@ for (int j = 0; j <= bagSize; j++) { // 列,遍历背包
|
|||||||
这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。
|
这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。
|
||||||
|
|
||||||
|
|
||||||
5. 举例推导dp数组
|
#### 5. 举例推导dp数组
|
||||||
|
|
||||||
输入:nums: [1, 1, 1, 1, 1], target: 3
|
输入:nums: [1, 1, 1, 1, 1], target: 3
|
||||||
|
|
||||||
@ -421,7 +421,7 @@ public:
|
|||||||
|
|
||||||
dp[i][j] 去掉 行的维度,即 dp[j],表示:填满j(包括j)这么大容积的包,有dp[j]种方法。
|
dp[i][j] 去掉 行的维度,即 dp[j],表示:填满j(包括j)这么大容积的包,有dp[j]种方法。
|
||||||
|
|
||||||
2. 确定递推公式
|
#### 2. 确定递推公式
|
||||||
|
|
||||||
二维DP数组递推公式: `dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];`
|
二维DP数组递推公式: `dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];`
|
||||||
|
|
||||||
@ -429,17 +429,17 @@ dp[i][j] 去掉 行的维度,即 dp[j],表示:填满j(包括j)这么
|
|||||||
|
|
||||||
**这个公式在后面在讲解背包解决排列组合问题的时候还会用到!**
|
**这个公式在后面在讲解背包解决排列组合问题的时候还会用到!**
|
||||||
|
|
||||||
3. dp数组如何初始化
|
#### 3. dp数组如何初始化
|
||||||
|
|
||||||
在上面 二维dp数组中,我们讲解过 dp[0][0] 初始为1,这里dp[0] 同样初始为1 ,即装满背包为0的方法有一种,放0件物品。
|
在上面 二维dp数组中,我们讲解过 dp[0][0] 初始为1,这里dp[0] 同样初始为1 ,即装满背包为0的方法有一种,放0件物品。
|
||||||
|
|
||||||
4. 确定遍历顺序
|
#### 4. 确定遍历顺序
|
||||||
|
|
||||||
在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们系统讲过对于01背包问题一维dp的遍历。
|
在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们系统讲过对于01背包问题一维dp的遍历。
|
||||||
|
|
||||||
遍历物品放在外循环,遍历背包在内循环,且内循环倒序(为了保证物品只使用一次)。
|
遍历物品放在外循环,遍历背包在内循环,且内循环倒序(为了保证物品只使用一次)。
|
||||||
|
|
||||||
5. 举例推导dp数组
|
#### 5. 举例推导dp数组
|
||||||
|
|
||||||
输入:nums: [1, 1, 1, 1, 1], target: 3
|
输入:nums: [1, 1, 1, 1, 1], target: 3
|
||||||
|
|
||||||
@ -526,7 +526,6 @@ dp[j] += dp[j - nums[i]];
|
|||||||
|
|
||||||
## 其他语言版本
|
## 其他语言版本
|
||||||
|
|
||||||
|
|
||||||
### Java
|
### Java
|
||||||
```java
|
```java
|
||||||
class Solution {
|
class Solution {
|
||||||
|
Reference in New Issue
Block a user