背包九讲3——多重背包问题的理解(Java图解)

多重背包

题目

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

基本算法

这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

 

多重背包模板代码:

//N为物品数目
//W为背包容量
//num[]为每个物品的数目
//weights[]为每个物品的体积
//values[]为每个物品的价值
public int multiKnapack(int N, int W, int[] num, int[] weights, int[] values){
    int[] dp = new int[W+1];
    for(int i = 1; i <= N; i++){
        int M = num[i-1], w = weights[i-1], v = values[i-1];
        for(int j = W; j >= w; j--){
            for(int k = 0; k <= M && k * w < =j; k++){
                dp[j] = Math.max(dp[j], dp[j-k*w]+k*v);
            }
        }
    }
    return dp[W];
}

(内容待补充,使用单调队列优化基本算法的状态转移方程)

 

推荐:

背包九讲1——01背包问题的理解(Java图解)

https://blog.csdn.net/caigen0001/article/details/106698380

背包九讲2——完全背包问题的理解(Java图解)

https://blog.csdn.net/caigen0001/article/details/106711469

背包九讲3——多重背包问题的理解(Java图解)

https://blog.csdn.net/caigen0001/article/details/106720118

背包九讲4——二维背包问题的理解(Java图解)

https://blog.csdn.net/caigen0001/article/details/106720280

 

 

参考资料:

背包九讲 https://github.com/tianyicui/pack

背包九讲专题 https://www.bilibili.com/video/BV1qt411Z7nE?from=search&seid=6165804124910947817

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值