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