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
    发布时间:
    原始链接:
  • 相关阅读:
    FlowNet2.0论文笔记
    LeetCode NO477.汉明距离总和
    自然语言的分词方法之N-gram语言模型
    C++函数模板及其实例化和具体化
    Vue2源码解读(5)
    Vue2源码解读(4)
    Vue2源码解读(3)
    Vue2源码解读(2)
    Vue2源码解读(1)
    vue的双向绑定原理及实现
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/bag-3.html
Copyright © 2011-2022 走看看