( 动态规划专题 )【 分组背包 】
问题:n件物品,有重量w和价值p,将这些物品划分成k组,每一组里只能选择至多1件物品,背包容量为sum,求价值最大能拿多少
分组背包就是01背包的变式,只不过加了个限制,每个组最多只能拿一个,这就只需要把一个组抽象成一个物品作为第一个for循环,在第二层for循环固定住当前背包容量v时,再枚举这个组的物品看看那个最优更新dp[v]。
分组背包:
for i=1 to k {
for v=sum to 0 {
for item in group i {
if ( v>=item.w ) {
dp[v] = max dp[v], dp[ v-item.w ] + item.p;
}
}
}
}