zoukankan      html  css  js  c++  java
  • 完全背包

    在昨天我已经很详细的讲解过01背包的动态规划问题了.

    先看问题:在n种物品中选取若干件(同一种物品可多次选取)放在空间为v的背包里,每种物品的体积为c1,c2,…,cn,与之相对应的价值为w1,w2,…,wn.求解怎么装物品可使背包里物品总价值最大

    看完这个问题,你也许会觉得这个不就是01背包的升级版吗,其实就是这样,完全背包问题与01背包问题的区别在于完全背包每一件物品的数量都有无限个,而01背包每件物品数量只有1个

    所以说与它相关的策略已经不是只有取和不取这两种策略了,而是有取0件、取1件、取2件……等等很多种策略

    如果我们用和01背包一样的状态,f[i][v]表示前i种物品恰放入一个容量为v的背包的最大价值,那我们应该用k表示当前容量下可以装第i种物品的件数,那么k的范围应该是0≤k≤v/c[i],

    既然要用当前物品i把当前容量装满,那需要0≤k≤v/c[i]件,其中k表示件数。

    然后有一个式子跟(01背包一样的有一个式子)

    下面给出状态转移方程:f[i][j] = max{f[i][j],f[i-1][j - k * c[i]] + k * w[i]}(0<=k*c[i]<=v)

    我们可以对其进行优化:如果有两件物品a、b满足c[a]<=c[b]且w[a]>=w[b],则将物品b去掉,不用考虑。因为你可以用 占用体积小的物品 得到 比 占用体积大的物品还要多的价值,何乐而不为呢。其实对于完全背包,可以再优化,首先将容量大于v的物品去掉,然后排序计算出容量相同的物品中价值最高的是哪个,我们只要价值大的就可以了。

    这就是完全背包的基本概念。

     

     

     

     

  • 相关阅读:
    ajax_基础1
    省市数据库脚本TblArea.
    c#中怎么使用dos命
    Lambda表达式
    面试收录
    .Net牛逼程序猿要懂得
    Web.config 配置文件
    sql 查询所有数据库、表名、表字段总结
    Json在net与页面之间的传递
    『转』SAP统驭科目解释
  • 原文地址:https://www.cnblogs.com/kevin6666/p/10950088.html
Copyright © 2011-2022 走看看