分组背包问题也很简单,01背包问题就可以看作是分组背包问题的特殊情况,一个物品一组。
解析
分组背包问题是多个物品一组,每组只能用一个,所以很简单,就是在01背包问题的基础上,在外层加一个组别的循环。
代码
N, V = map(int, input().split())
groups = []
for _ in range(N):
Si = int(input())
group = []
for __ in range(Si):
vij, wij = map(int, input().split())
group.append((vij, wij))
groups.append(group)
dp=[[0]*(V+1) for _ in range(N+1)]
for i in range(1, N + 1):
# 复制前一组的状态(因为每组物品只能选一个,所以我们需要保留前一组的状态)
for v in range(V + 1):
dp[i][v] = dp[i - 1][v] # 如果不选第 i 组的任何物品
# 遍历第 i 组的每个物品
for j, (volume, value) in enumerate(groups[i - 1]):
# 遍历所有可能的背包容量
for v in range(V, volume - 1, -1):
# 更新 dp 数组(选择能带来最大价值的物品)
dp[i][v] = max(dp[i][v], dp[i - 1][v - volume] + value)
print(dp[N][V])