Skip to content

Commit f156de2

Browse files
committed
acwing: 9_grouped_knapsack_backpack_problem.go
1 parent 0795b43 commit f156de2

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package main
2+
3+
import "fmt"
4+
5+
const N = 110
6+
7+
var (
8+
// n组物品 背包容量m
9+
n, m int
10+
// v[i][j], w[i][j]: 第i组第j个物品的体积、价值
11+
v, w [N][N]int
12+
// s[i]:第i组有几个物品 f[j]: 体积为j时的最大价值
13+
s, f [N]int
14+
)
15+
16+
func max(a, b int) int {
17+
if a > b {
18+
return a
19+
}
20+
return b
21+
}
22+
23+
func main() {
24+
fmt.Scan(&n, &m)
25+
26+
for i := 1; i <= n; i++ {
27+
fmt.Scan(&s[i])
28+
for j := 0; j < s[i]; j++ {
29+
fmt.Scan(&v[i][j], &w[i][j])
30+
}
31+
}
32+
33+
// 枚举组
34+
for i := 1; i <= n; i++ {
35+
// 体积,直接采用01背包的优化
36+
for j := m; j >= 0; j-- {
37+
// 枚举物品数量,不超过s[i]个
38+
for k := 0; k <= s[i]; k++ {
39+
// 物品体积小于等于j的才选择
40+
if j >= v[i][k] {
41+
f[j] = max(f[j], f[j-v[i][k]]+w[i][k])
42+
}
43+
}
44+
}
45+
}
46+
47+
fmt.Println(f[m])
48+
}

0 commit comments

Comments
 (0)