【算法学习】分组背包问题

这篇博客探讨了如何解决分组背包问题,其中物品被划分为多个冲突组,每组最多选择一件物品。通过将每组视为独立的01背包问题,利用动态规划的方法,对每组进行遍历以求得最大价值。输入包括背包容量、物品数量和组号,输出是能实现最大价值的物品选择策略。文章介绍了从二维到一维数组转化的动态规划实现过程,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有N件物品和一个容量为V的背包,第i件物品的重量为w[i],价值为v[i],这些物品被划分成了若干组,每组中的物品互相冲突,最多选一件
问将哪些物品放入背包中可以使背包获得最大的价值

对于每一组的物品,都可以看成是一个01背包问题,对每组的物品都处理一遍即可。

输入格式:
第一行:三个整数,V(背包容量,V<=200),N(物品数量,N<=30)和T(最大组号,T<=10);
第2…N+1行:每行三个整数Wi,Vi,p,表示每个物品的重量,价值,所属组号。
这篇博客参考的思路
博客参考
若是二维数组的表现形式:

  1. 组数循环
  2. 物品选择
  3. 体积循环
    // 二维数组:
    f[k][j]表示前k组体积为j的最大价值
    for(int k=1; k<=T; ++k)            //组别
        for(int i=1; i<=N; ++i)       //物品
            for(int j=V; j>=0; j--)   //体积
                f[k][j] = max(f[k][j], v[k][i]+f[k-1][j-w[k][i]] );  //求组这组最大

其中,f[k-1][j] 指的是前k-1组体积为j的最大价值,因此v[k][i] + f[k-1][j-w[k][i]]意思是:取当前这组第i个物品 + 前k-1组体积为j-w[k][i](体积就还剩扣掉当前物品的体积的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值