动态背包问题
`package main
import "fmt"
func main() {
fmt.Println(knapsack([]int{1, 2, 3}, []int{6, 10, 12}, 5))
}
func knapsack(w []int, v []int, C int) int {
n := len(w)
memo := make([][]int, n)
for i, _ := range memo {
memo[i] = make([]int, C+1)
}
for i := 0; i <= C; i++ {
if i > w[0] {
memo[0][i] = v[0]
} else {
memo[0][i] = 0
}
}
for i := 1; i < n; i++ {
for j := 0; j <= C; j++ {
if j >= w[i] {
memo[i][j] = max(memo[i-1][j], memo[i-1][j-w[i]]+v[i])
} else {
memo[i][j] = memo[i-1][j]
}
}
}
//print(memo)
return memo[n-1][C]
}
func max(x int, y int) int {
if x > y {
return x
}
return y
}
func print(memo [][]int) {
for _, m := range memo {
fmt.Println(m)
}
}
`
关键
状态转换方程: f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
其中:
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。


浙公网安备 33010602011771号