01背包问题总结
首先,需要清楚的是0/1背包问题本身:有 n
件物品和一个最多能背重量为 w
的背包。第 i
件物品的重量是 weight[i]
,得到的价值是 value[i]
。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
此处使用动态规划求解,问题的划分方式为:使用一个二维数组对问题进行两部分的划分。对于 dp[i][j]
求解的是,当背包容量为 j
时,在物品 0-i
中选择能够获取到的最大的容量。
那么在采取逐行遍历的方式,就是每一次增加物品的数量,递推公式为: dp[i][j]=max(dp[i][j],dp[i-1][j-weight[i]]+value[i])
采取逐列遍历的方式,每一次增加的是背包的容量,那么递推公式为: dp[i][j]=max(dp[i][j],dp[i-1][j-weight[i]]+value[i])
使用滚动数组实现动态规划的过程:基于背包容量的滚动数组实现,那么此处就一定要先遍历物品再遍历背包了,因为动态规划数组的含义是,在第 i
次迭代中,使用 0-i
个物品去填充背包,能够得到的背包中物品的最大价值。并且是0/1背包问题,那么对于背包的遍历顺序一定要是
能否基于物品数量的滚动数组实现:
动态规划数组的定义:定义数组
dp[n]
,在初始时表示,当背包容量为0时,能够装下的最大的物品价值。动态规划数组的推导:对于第
j
次迭代时,表示当背包容量为j
时,能够装下的物品的最大价值。在一维的情形下,背包容量减去weight[i]
的情形无法实现递推。
因此在0/1背包中使用滚动数组,只能基于背包容量的数组来实现。