分组背包问题

分组背包问题也很简单,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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值