This commit is contained in:
markwang
2024-08-09 15:05:17 +08:00
parent 93c206794b
commit bb2803ce96
2 changed files with 65 additions and 65 deletions

View File

@ -440,53 +440,53 @@ print(dp[n - 1][bagweight])
package main package main
import ( import (
"fmt" "fmt"
) )
func main() { func main() {
var n, bagweight int // bagweight代表行李箱空间 var n, bagweight int // bagweight代表行李箱空间
fmt.Scan(&n, &bagweight) fmt.Scan(&n, &bagweight)
weight := make([]int, n) // 存储每件物品所占空间 weight := make([]int, n) // 存储每件物品所占空间
value := make([]int, n) // 存储每件物品价值 value := make([]int, n) // 存储每件物品价值
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
fmt.Scan(&weight[i]) fmt.Scan(&weight[i])
} }
for j := 0; j < n; j++ { for j := 0; j < n; j++ {
fmt.Scan(&value[j]) fmt.Scan(&value[j])
} }
// dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值 // dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值
dp := make([][]int, n) dp := make([][]int, n)
for i := range dp { for i := range dp {
dp[i] = make([]int, bagweight+1) dp[i] = make([]int, bagweight + 1)
} }
// 初始化, 因为需要用到dp[i - 1]的值 // 初始化, 因为需要用到dp[i - 1]的值
// j < weight[0]已在上方被初始化为0 // j < weight[0]已在上方被初始化为0
// j >= weight[0]的值就初始化为value[0] // j >= weight[0]的值就初始化为value[0]
for j := weight[0]; j <= bagweight; j++ { for j := weight[0]; j <= bagweight; j++ {
dp[0][j] = value[0] dp[0][j] = value[0]
} }
for i := 1; i < n; i++ { // 遍历科研物品 for i := 1; i < n; i++ { // 遍历科研物品
for j := 0; j <= bagweight; j++ { // 遍历行李箱容量 for j := 0; j <= bagweight; j++ { // 遍历行李箱容量
if j < weight[i] { if j < weight[i] {
dp[i][j] = dp[i-1][j] // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 dp[i][j] = dp[i-1][j] // 如果装不下这个物品,那么就继承dp[i - 1][j]的值
} else { } else {
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])
} }
} }
} }
fmt.Println(dp[n-1][bagweight]) fmt.Println(dp[n-1][bagweight])
} }
func max(x, y int) int { func max(x, y int) int {
if x > y { if x > y {
return x return x
} }
return y return y
} }
``` ```

View File

@ -313,50 +313,50 @@ for i in range(1, n):
print(dp[n - 1][bagweight]) print(dp[n - 1][bagweight])
``` ```
### Go ### Go
```go ```go
package main package main
import ( import (
"fmt" "fmt"
) )
func main() { func main() {
// 读取 M 和 N // 读取 M 和 N
var M, N int var M, N int
fmt.Scan(&M, &N) fmt.Scan(&M, &N)
costs := make([]int, M) costs := make([]int, M)
values := make([]int, M) values := make([]int, M)
for i := 0; i < M; i++ { for i := 0; i < M; i++ {
fmt.Scan(&costs[i]) fmt.Scan(&costs[i])
} }
for j := 0; j < M; j++ { for j := 0; j < M; j++ {
fmt.Scan(&values[j]) fmt.Scan(&values[j])
} }
// 创建一个动态规划数组dp初始值为0 // 创建一个动态规划数组dp初始值为0
dp := make([]int, N + 1) dp := make([]int, N + 1)
// 外层循环遍历每个类型的研究材料 // 外层循环遍历每个类型的研究材料
for i := 0; i < M; i++ { for i := 0; i < M; i++ {
// 内层循环从 N 空间逐渐减少到当前研究材料所占空间 // 内层循环从 N 空间逐渐减少到当前研究材料所占空间
for j := N; j >= costs[i]; j-- { for j := N; j >= costs[i]; j-- {
// 考虑当前研究材料选择和不选择的情况,选择最大值 // 考虑当前研究材料选择和不选择的情况,选择最大值
dp[j] = max(dp[j], dp[j-costs[i]] + values[i]) dp[j] = max(dp[j], dp[j-costs[i]] + values[i])
} }
} }
// 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值 // 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值
fmt.Println(dp[N]) fmt.Println(dp[N])
} }
func max(x, y int) int { func max(x, y int) int {
if x > y { if x > y {
return x return x
} }
return y return y
} }
``` ```