算法萌新如何学好动态规划(3)( 三 )


。 而在我们更新完
算法萌新如何学好动态规划(3)文章插图
后 ,
算法萌新如何学好动态规划(3)文章插图
的值即变为
算法萌新如何学好动态规划(3)文章插图
的值 , 由此我们大大降低了该算法的空间开销 , 这种空间优化方法叫做「滚动数组」 。
完全背包了解完「0/1 背包」模型后 , 我们继续介绍「完全背包」模型 , 其基本问题如下所示:
一共有 N 类物品 , 其中第 i 类物品的体积为
算法萌新如何学好动态规划(3)文章插图
, 价值为
算法萌新如何学好动态规划(3)文章插图
, 且每类物品可以选无数个 。 现要求选择一些物品放入一个容积为 M 的背包中 , 使得物品总体积不超过 M 的前提下 , 物品总价值最大 。
不难发现 , 「完全背包」与「0/1 背包」最大的差别就在于每一类物品可以选多少个 , 其中「完全背包」每一类物品可以选无数个 , 而「0/1 背包」中每一类物品只能选 1 个 。
了解完模型差异后 , 我们继续思考如何解决该问题 。 与「0/1 背包」模型比较类似 , 本问题也只有三个参数 , 分别是物品编号、物品体积以及物品价值 。 因此我们可以照搬「0/1 背包」的「DP 状态」 , 即
算法萌新如何学好动态规划(3)文章插图
表示仅考虑前 i 类物品 , 所选物品总体积为 j 时的最大物品总价值 。
由于每一类物品可以选无数次 , 因此对于
算法萌新如何学好动态规划(3)文章插图
来说 , 如果不取则
算法萌新如何学好动态规划(3)文章插图
, 如果取一个则
算法萌新如何学好动态规划(3)文章插图
, 如果取两个则
算法萌新如何学好动态规划(3)文章插图
, 如果取 x 个则
算法萌新如何学好动态规划(3)文章插图

因此我们可以得到
算法萌新如何学好动态规划(3)文章插图
但这样的话我们就需要不断遍历 x , 显然会导致时间复杂度过高 , 因此我们还可以继续优化 。
算法萌新如何学好动态规划(3)文章插图
又因为
算法萌新如何学好动态规划(3)文章插图
因此只要正序遍历 j , 即保证求取
算法萌新如何学好动态规划(3)文章插图
时 ,
算法萌新如何学好动态规划(3)文章插图
已经得到 , 「DP 转移方程」就可以优化为
算法萌新如何学好动态规划(3)文章插图
对比「0/1 背包」中
算法萌新如何学好动态规划(3)文章插图


推荐阅读