zoukankan      html  css  js  c++  java
  • 背包九讲-第三讲 多重背包

    题目

    有一个容量为V的背包和N种物品,第i件物品的体积是c[i] 价值是w[i] 共有n[i]件,请给出一种策略使得装入背包中的物品价值最高.

    基本算法

    和完全背包问题类似,区别是完全背包每种物品的数量是无限的而多重背包是有限的.可以仿照完全背包写出状态转移方程:
    f[i][v] = max(f[i-1][v-k*c[i]] + k*w[i] | 0<=k<=n[i])

    转化为01背包

    和完全背包类似,多重背包同样可以转化为01背包: 把第i种物品换成n[i]件01背包中的物品,则可以将多重背包转化为01背包.

    仍然可以像完全背包一样通过二进制来降低复杂度,将第i种物品换成若干件物品,其中每件物品有一个系数表示这件物品的体积和价值均是原来的系数倍,这些系数分别是1,2,4···2^(k-1),n[i]-2^k+1,k满足2^k+1>n[i]

    下面给出O(log amount)时间处理一件多重背包中物品的过程,其中amount表示物品的数量:

    procedure MultiplePack(cost,weight,amount)
        if cost*amount>=V
            CompletePack(cost,weight)
            return
        integer k=1
        while k<amount
            ZeroOnePack(k*cost,k*weight)
            amount=amount-k
            k=k*2
        ZeroOnePack(amount*cost,amount*weight)
    

    O(VN)的算法

    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    ! JOISC2020DAY2变色龙之恋
    ! JOISC2020DAY1扫除
    JOISC2020DAY1汉堡肉
    JOISC2020DAY1建筑装饰4
    ! JLOI/SHOI2016随机序列
    JLOI/SHOI2016黑暗前的幻想乡
    ! JLOI/SHOI2016成绩比较
    JLOI/SHOI2016方
    JLOI/SHOI2016侦查守卫
    ! AHOI/HNOI2017抛硬币
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/bag-3.html
Copyright © 2011-2022 走看看