diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index 2e1cd52c..36458ee6 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -437,6 +437,58 @@ print(dp[n - 1][bagweight]) ### Go ```go +package main + +import ( + "fmt" +) + +func main() { + var n, bagweight int // bagweight代表行李箱空间 + fmt.Scan(&n, &bagweight) + + weight := make([]int, n) // 存储每件物品所占空间 + value := make([]int, n) // 存储每件物品价值 + + for i := 0; i < n; i++ { + fmt.Scan(&weight[i]) + } + for j := 0; j < n; j++ { + fmt.Scan(&value[j]) + } + // dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值 + dp := make([][]int, n) + for i := range dp { + dp[i] = make([]int, bagweight + 1) + } + + // 初始化, 因为需要用到dp[i - 1]的值 + // j < weight[0]已在上方被初始化为0 + // j >= weight[0]的值就初始化为value[0] + for j := weight[0]; j <= bagweight; j++ { + dp[0][j] = value[0] + } + + for i := 1; i < n; i++ { // 遍历科研物品 + for j := 0; j <= bagweight; j++ { // 遍历行李箱容量 + if j < weight[i] { + dp[i][j] = dp[i-1][j] // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) + } + } + } + + fmt.Println(dp[n-1][bagweight]) +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} + ``` ### Javascript diff --git a/problems/背包理论基础01背包-2.md b/problems/背包理论基础01背包-2.md index c61a72cc..cd8f317c 100644 --- a/problems/背包理论基础01背包-2.md +++ b/problems/背包理论基础01背包-2.md @@ -313,7 +313,7 @@ for i in range(1, n): print(dp[n - 1][bagweight]) ``` -### Go +### Go ```go package main @@ -322,46 +322,41 @@ import ( ) func main() { - var n, bagweight int - fmt.Scan(&n, &bagweight) + // 读取 M 和 N + var M, N int + fmt.Scan(&M, &N) - weight := make([]int, n) - value := make([]int, n) + costs := make([]int, M) + values := make([]int, M) - for i := 0; i < n; i++ { - fmt.Scan(&weight[i]) + for i := 0; i < M; i++ { + fmt.Scan(&costs[i]) } - for j := 0; j < n; j++ { - fmt.Scan(&value[j]) + for j := 0; j < M; j++ { + fmt.Scan(&values[j]) } - dp := make([][]int, n) - for i := range dp { - dp[i] = make([]int, bagweight+1) - } + // 创建一个动态规划数组dp,初始值为0 + dp := make([]int, N + 1) - for j := weight[0]; j <= bagweight; j++ { - dp[0][j] = value[0] - } - - for i := 1; i < n; i++ { - for j := 0; j <= bagweight; j++ { - if j < weight[i] { - dp[i][j] = dp[i-1][j] - } else { - dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) - } + // 外层循环遍历每个类型的研究材料 + for i := 0; i < M; i++ { + // 内层循环从 N 空间逐渐减少到当前研究材料所占空间 + for j := N; j >= costs[i]; j-- { + // 考虑当前研究材料选择和不选择的情况,选择最大值 + dp[j] = max(dp[j], dp[j-costs[i]] + values[i]) } } - fmt.Println(dp[n-1][bagweight]) + // 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值 + fmt.Println(dp[N]) } -func max(a, b int) int { - if a > b { - return a +func max(x, y int) int { + if x > y { + return x } - return b + return y } ```