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 0114d33

Browse files
Merge pull request youngyangyang04#2681 from markwang1992/01bag
0-1背包理论基础(二)增加Go一维dp数组,二维dp数组移至0-1背包理论基础(一),增加相应注释
2 parents 0f74e69 + bb2803c commit 0114d33

File tree

2 files changed

+76
-29
lines changed

2 files changed

+76
-29
lines changed

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,58 @@ print(dp[n - 1][bagweight])
437437
### Go
438438

439439
```go
440+
package main
441+
442+
import (
443+
"fmt"
444+
)
445+
446+
func main() {
447+
var n, bagweight int // bagweight代表行李箱空间
448+
fmt.Scan(&n, &bagweight)
449+
450+
weight := make([]int, n) // 存储每件物品所占空间
451+
value := make([]int, n) // 存储每件物品价值
452+
453+
for i := 0; i < n; i++ {
454+
fmt.Scan(&weight[i])
455+
}
456+
for j := 0; j < n; j++ {
457+
fmt.Scan(&value[j])
458+
}
459+
// dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值
460+
dp := make([][]int, n)
461+
for i := range dp {
462+
dp[i] = make([]int, bagweight + 1)
463+
}
464+
465+
// 初始化, 因为需要用到dp[i - 1]的值
466+
// j < weight[0]已在上方被初始化为0
467+
// j >= weight[0]的值就初始化为value[0]
468+
for j := weight[0]; j <= bagweight; j++ {
469+
dp[0][j] = value[0]
470+
}
471+
472+
for i := 1; i < n; i++ { // 遍历科研物品
473+
for j := 0; j <= bagweight; j++ { // 遍历行李箱容量
474+
if j < weight[i] {
475+
dp[i][j] = dp[i-1][j] // 如果装不下这个物品,那么就继承dp[i - 1][j]的值
476+
} else {
477+
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i])
478+
}
479+
}
480+
}
481+
482+
fmt.Println(dp[n-1][bagweight])
483+
}
484+
485+
func max(x, y int) int {
486+
if x > y {
487+
return x
488+
}
489+
return y
490+
}
491+
440492
```
441493

442494
### Javascript

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

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ for i in range(1, n):
313313
print(dp[n - 1][bagweight])
314314

315315
```
316-
### Go
316+
### Go
317317
```go
318318
package main
319319

@@ -322,46 +322,41 @@ import (
322322
)
323323

324324
func main() {
325-
var n, bagweight int
326-
fmt.Scan(&n, &bagweight)
325+
// 读取 M 和 N
326+
var M, N int
327+
fmt.Scan(&M, &N)
327328

328-
weight := make([]int, n)
329-
value := make([]int, n)
329+
costs := make([]int, M)
330+
values := make([]int, M)
330331

331-
for i := 0; i < n; i++ {
332-
fmt.Scan(&weight[i])
333-
}
334-
for j := 0; j < n; j++ {
335-
fmt.Scan(&value[j])
332+
for i := 0; i < M; i++ {
333+
fmt.Scan(&costs[i])
336334
}
337-
338-
dp := make([][]int, n)
339-
for i := range dp {
340-
dp[i] = make([]int, bagweight+1)
335+
for j := 0; j < M; j++ {
336+
fmt.Scan(&values[j])
341337
}
342338

343-
for j := weight[0]; j <= bagweight; j++ {
344-
dp[0][j] = value[0]
345-
}
339+
// 创建一个动态规划数组dp,初始值为0
340+
dp := make([]int, N + 1)
346341

347-
for i := 1; i < n; i++ {
348-
for j := 0; j <= bagweight; j++ {
349-
if j < weight[i] {
350-
dp[i][j] = dp[i-1][j]
351-
} else {
352-
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i])
353-
}
342+
// 外层循环遍历每个类型的研究材料
343+
for i := 0; i < M; i++ {
344+
// 内层循环从 N 空间逐渐减少到当前研究材料所占空间
345+
for j := N; j >= costs[i]; j-- {
346+
// 考虑当前研究材料选择和不选择的情况,选择最大值
347+
dp[j] = max(dp[j], dp[j-costs[i]] + values[i])
354348
}
355349
}
356350

357-
fmt.Println(dp[n-1][bagweight])
351+
// 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值
352+
fmt.Println(dp[N])
358353
}
359354

360-
func max(a, b int) int {
361-
if a > b {
362-
return a
355+
func max(x, y int) int {
356+
if x > y {
357+
return x
363358
}
364-
return b
359+
return y
365360
}
366361

367362
```

0 commit comments

Comments
(0)

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