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

Commit f3ddf8f

Browse files
优化表达
1 parent e7f9678 commit f3ddf8f

File tree

1 file changed

+8
-10
lines changed

1 file changed

+8
-10
lines changed

‎problems/背包理论基础01背包-1.md‎

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目,
4141

4242
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。
4343

44-
![动态规划-背包问题](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117175428387.jpg)
45-
4644
这是标准的背包问题,以至于很多同学看了这个自然就会想到背包,甚至都不知道暴力的解法应该怎么解了。
4745

4846
这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢?
@@ -73,7 +71,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目,
7371

7472
依然动规五部曲分析一波。
7573

76-
1. 确定dp数组以及下标的含义
74+
#### 1. 确定dp数组以及下标的含义
7775

7876
我们需要使用二维数组,为什么呢?
7977

@@ -87,7 +85,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目,
8785

8886
i 来表示物品、j表示背包容量。
8987

90-
(如果想用j 表示物品,j表示背包容量 行不行? 都可以的,个人习惯而已)
88+
(如果想用j 表示物品,i表示背包容量 行不行? 都可以的,个人习惯而已)
9189

9290
我们来尝试把上面的 二维表格填写一下。
9391

@@ -131,7 +129,7 @@ i 来表示物品、j表示背包容量。
131129

132130
**要时刻记着这个dp数组的含义,下面的一些步骤都围绕这dp数组的含义进行的**,如果哪里看懵了,就来回顾一下i代表什么,j又代表什么。
133131

134-
2. 确定递推公式
132+
#### 2. 确定递推公式
135133

136134
这里在把基本信息给出来:
137135

@@ -176,7 +174,7 @@ i 来表示物品、j表示背包容量。
176174

177175
递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);`
178176

179-
3. dp数组如何初始化
177+
#### 3. dp数组如何初始化
180178

181179
**关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱**
182180

@@ -197,8 +195,8 @@ dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包
197195
代码初始化如下:
198196

199197
```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;
202200
}
203201
// 正序遍历
204202
for (int j = weight[0]; j <= bagweight; j++) {
@@ -236,7 +234,7 @@ for (int j = weight[0]; j <= bagweight; j++) {
236234
237235
**费了这么大的功夫,才把如何初始化讲清楚,相信不少同学平时初始化dp数组是凭感觉来的,但有时候感觉是不靠谱的**。
238236
239-
4. 确定遍历顺序
237+
#### 4. 确定遍历顺序
240238
241239
在如下图中,可以看出,有两个遍历的维度:物品与背包重量
242240
@@ -293,7 +291,7 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括
293291

294292
**其实背包问题里,两个for循环的先后循序是非常有讲究的,理解遍历顺序其实比理解推导公式难多了**
295293

296-
5. 举例推导dp数组
294+
#### 5. 举例推导dp数组
297295

298296
来看一下对应的dp数组的数值,如图:
299297

0 commit comments

Comments
(0)

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