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
    发布时间:
    原始链接:
  • 相关阅读:
    spring-mvc----数据库数据到页面错误--tomcat启动不了
    springmvc注解@RequestMapping
    数据库到jsp页面报错(一)
    IDEA秒退或者一直让填写激活码问题
    spting Boot 创建一个springBoot项目
    SSM框架整合(实现从数据库到页面展示)
    asp.net dbproviderfactory(提供程序工厂模型)多数据库访问
    connectionStrings 中的 providerName 属性
    IDisposable
    利用提示引导语句运行
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/bag-3.html
Copyright © 2011-2022 走看看