• 为什么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背包和完全背包,之所以推的方向不同,是由于原来的二维方程不同。一维方程正好只是巧合而已。

  • 相关阅读:
    ActiveForm
    phpstudy配置虚拟主机
    PHP 二分查找
    mysql group by 用法解析(详细)
    Linux(CentOS)下的apache服务器配置与管理
    ubuntu server sudo出现sudo:must be setuid root 完美解决办法
    VB连接MYSQL数据的方法
    mysql 远程登录及常用命令
    在eclipse上搭建Roku开发环境
    linux ps查进程 kill关闭进程
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/7782700.html
Copyright © 2020-2023  润新知