01背包问题

216 阅读1分钟

2.1 版本1 二维

(1)状态f[i][j]定义:前 ii 个物品,背包容量 jj 下的最优解(最大价值):

当前的状态依赖于之前的状态,可以理解为从初始状态f[0][0] = 0开始决策,有 NN 件物品,则需要 NN 次决 策,每一次对第 ii 件物品的决策,状态f[i][j]不断由之前的状态更新而来。
(2)当前背包容量不够(j < v[i]),没得选,因此前 ii 个物品最优解即为前 i−1i−1 个物品最优解:

对应代码:f[i][j] = f[i - 1][j]。
(3)当前背包容量够,可以选,因此需要决策选与不选第 ii 个物品:

选:f[i][j] = f[i - 1][j - v[i]] + w[i]。
不选:f[i][j] = f[i - 1][j] 。
我们的决策是如何取到最大价值,因此以上两种情况取 max() 。

优化成一维方式

j从小到大的话 那说明 j-v[i] 的时候已经算在了i的这里了,所以要从大到小 现在求f[j],要用到<=j的各位数据,结合二维,如果从小到大枚举,现在算的f[ <j ]的各个数据是不是就是f[i] [ <=j ]的? 而如果从大到小枚举,现在求f[j]用到的f[ <=j ]的各个数据就是上一轮循环求的数据,即f[i-1][ <=j ],此时i时,对应的<=j数据 还没有被得出来
在算 第i个物品的时候要保证 j-v[i] 没有算过,需要用的是i-1的时候的j的状态