优化表达

This commit is contained in:
programmercarl
2024-12-11 11:54:47 +08:00
parent e7f96785d4
commit f3ddf8fc16

View File

@ -41,8 +41,6 @@ leetcode上没有纯01背包的问题都是01背包应用方面的题目
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。
![动态规划-背包问题](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117175428387.jpg)
这是标准的背包问题,以至于很多同学看了这个自然就会想到背包,甚至都不知道暴力的解法应该怎么解了。 这是标准的背包问题,以至于很多同学看了这个自然就会想到背包,甚至都不知道暴力的解法应该怎么解了。
这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢? 这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢?
@ -73,7 +71,7 @@ leetcode上没有纯01背包的问题都是01背包应用方面的题目
依然动规五部曲分析一波。 依然动规五部曲分析一波。
1. 确定dp数组以及下标的含义 #### 1. 确定dp数组以及下标的含义
我们需要使用二维数组,为什么呢? 我们需要使用二维数组,为什么呢?
@ -87,7 +85,7 @@ leetcode上没有纯01背包的问题都是01背包应用方面的题目
i 来表示物品、j表示背包容量。 i 来表示物品、j表示背包容量。
如果想用j 表示物品,j表示背包容量 行不行? 都可以的,个人习惯而已) 如果想用j 表示物品,i表示背包容量 行不行? 都可以的,个人习惯而已)
我们来尝试把上面的 二维表格填写一下。 我们来尝试把上面的 二维表格填写一下。
@ -131,7 +129,7 @@ i 来表示物品、j表示背包容量。
**要时刻记着这个dp数组的含义下面的一些步骤都围绕这dp数组的含义进行的**如果哪里看懵了就来回顾一下i代表什么j又代表什么。 **要时刻记着这个dp数组的含义下面的一些步骤都围绕这dp数组的含义进行的**如果哪里看懵了就来回顾一下i代表什么j又代表什么。
2. 确定递推公式 #### 2. 确定递推公式
这里在把基本信息给出来: 这里在把基本信息给出来:
@ -176,7 +174,7 @@ i 来表示物品、j表示背包容量。
递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);` 递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);`
3. dp数组如何初始化 #### 3. dp数组如何初始化
**关于初始化一定要和dp数组的定义吻合否则到递推公式的时候就会越来越乱** **关于初始化一定要和dp数组的定义吻合否则到递推公式的时候就会越来越乱**
@ -197,8 +195,8 @@ dp[0][j]i为0存放编号0的物品的时候各个容量的背包
代码初始化如下: 代码初始化如下:
```CPP ```CPP
for (int j = 0 ; j < weight[0]; j++) { // 当然这一步如果把dp数组预先初始化为0了这一步就可以省略但很多同学应该没有想清楚这一点。 for (int i = 1; i < weight.size(); i++) { // 当然这一步如果把dp数组预先初始化为0了这一步就可以省略但很多同学应该没有想清楚这一点。
dp[0][j] = 0; dp[i][0] = 0;
} }
// 正序遍历 // 正序遍历
for (int j = weight[0]; j <= bagweight; j++) { for (int j = weight[0]; j <= bagweight; j++) {
@ -236,7 +234,7 @@ for (int j = weight[0]; j <= bagweight; j++) {
**费了这么大的功夫才把如何初始化讲清楚相信不少同学平时初始化dp数组是凭感觉来的但有时候感觉是不靠谱的** **费了这么大的功夫才把如何初始化讲清楚相信不少同学平时初始化dp数组是凭感觉来的但有时候感觉是不靠谱的**
4. 确定遍历顺序 #### 4. 确定遍历顺序
在如下图中,可以看出,有两个遍历的维度:物品与背包重量 在如下图中,可以看出,有两个遍历的维度:物品与背包重量
@ -293,7 +291,7 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括
**其实背包问题里两个for循环的先后循序是非常有讲究的理解遍历顺序其实比理解推导公式难多了** **其实背包问题里两个for循环的先后循序是非常有讲究的理解遍历顺序其实比理解推导公式难多了**
5. 举例推导dp数组 #### 5. 举例推导dp数组
来看一下对应的dp数组的数值如图 来看一下对应的dp数组的数值如图