zoukankan      html  css  js  c++  java
  • 为什么01背包要倒着推,完全背包要顺着推

    为什么01背包要倒着推,完全背包要顺着推

    我忽然发现,这个小学的知识点,额,一直没有弄懂。现在赶快总结一下。

    01背包每个物品只能选一次,所以若用(f[i][v])表示前i件物品,恰好放入一个容量为v的背包可获得的最大价值,那么其二维状态转移方程是:(f[i][v]=max(f[i-1][v], f[i-1][v-c[i]]+w[i]))。注意是恰好,所以最后还要max一下。也可以不max,那么定义要把恰好去掉,并且(f[i][v])的初始值应当包括(f[i][v-1])

    显然01背包可以在空间上优化。采用滚动数组的思想,(fnow[v]=max(fpre[v], fpre[v-c[i]]+w[i]))。然而我们平时并不是这样写的,我们把fpre也优化掉了。通过倒推,我们可以让能够推出(f[v])的状态比(f[v])后更新,于是状态转移方程是(f[v]=max(f[v], f[v-c[i]]+w[i]))

    完全背包的二维转移方程是这样的:(f[i][v]=max(f[i-1][v], f[i][v-c[i]]+w[i]))。也就是说自己可以用到自己那一层的状态。所以如果想把第一位优化掉,可以直接顺推。而优化空间后的方程除了推的方向,和01背包是一模一样的。

    所以说,01背包和完全背包,之所以推的方向不同,是由于原来的二维方程不同。一维方程正好只是巧合而已。

  • 相关阅读:
    编译用到boost相关的东西,问题的解决;以及和googletest库
    看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph)
    centos5 升级到centos6
    Go vs Erlang
    Graphviz
    Oracle相关安装经验总结
    学习erlang书籍
    sublime使用总结
    List集合五种遍历方式
    nginx常用命令
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/7782700.html
Copyright © 2011-2022 走看看