zoukankan      html  css  js  c++  java
  • 动态规划>0/1背包问题 小强斋

    0/1背包问题

    有N件物品和一个容量为V的背包。第i件物品的重量是c[i],价值是w[i]。物品或者整件装入背包中, 或者根本不装入(即不能装入物品的一部分),求解将哪些物品装入背包可使价值总和最大。

    最优性原理对0/1背包问题成立

    算法基本思想

    利用动态规划思想 ,子问题为:f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。

    其状态转移方程是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}   

    解释一下上面的方程:“将前i件物品放入容量为v的背包中”这个子问题,如果只考虑第i件物品放或者不放,那么就可以转化为只涉及前i-1件物品的问题,即

    1、如果不放第i件物品,则问题转化为“前i-1件物品放入容量为v的背包中”;

    2、如果放第i件物品,则问题转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”(此时能获得的最大价值就是f [i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i])。

    f[i][v]的值就是1、2中最大的那个值。

    (注意:f[i][v]有意义当且仅当存在一个前i件物品的子集,其容量总和为v。所以按照这个方程递推完毕后,最终的答案并不一定是f[N] [V],而是f[N][0..V]的最大值。)

    例子1:

    C[v]从物品i=1开始,循环到物品3,期间,每次逆序得到容量v在前i件物品时可以得到的最大值。

    例子2:

      <---------------------------------------------------------------

     

    fori=1..N

       forv=V..0

            f[v]=max{f[v],f[v-c[i]]+w[i]};

    0/1背包

  • 相关阅读:
    Asp.Net服务器Cassini
    Vista系统Administrator帐户的激活与禁用
    SqlServer中的Top * With Ties
    SqlServer建远程服务连接
    SqlServer2005安装成功后补加Sa用户
    列出某个表中所有的列名
    水晶报表周期性打开报表失败
    Asp.net中文cookie的乱码问题
    HTML数据库编程、JavaScript数据库编程
    试图索引的限制
  • 原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5637377.html
Copyright © 2011-2022 走看看