美文网首页
动态规划1.2--背包问题之完全背包

动态规划1.2--背包问题之完全背包

作者: rensgf | 来源:发表于2021-04-20 22:45 被阅读0次

本文参考:动态规划:关于完全背包,你该了解这些!

1、问题定义

上一节,我们介绍了0-1背包,每种物品只有一件时,背包能装的最大价值。本节,我们讨论当每种物品的数量不限(也就是可以放入背包多次)时,背包能装的最大价值。

2、遍历顺序

0-1背包和完全背包唯一不同就是体现在遍历顺序上,所以本文就不去做动规五部曲了,我们直接针对遍历顺序经行分析!
首先,我们回顾一下,用滚动数组实现的01背包

for(int i = 0; i < weight.size(); i++) { // 遍历物品
  for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
      dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
  }
}

01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。当从小到大遍历时,同一个物体会被添加多次,这不正是完全背包需要的吗?!
完全背包的物品是可以添加多次的,所以要从小到大去遍历,即:

// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = weight[i]; j < bagWeight ; j++) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    }
}

三、内外循环

其实还有一个很重要的问题,为什么遍历物品在外层循环,遍历背包容量在内层循环?

这个问题大家都默认遍历物品在外层,遍历背包容量在内层,好像本应该如此一样,那么为什么呢?
01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一位dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。

在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序同样无所谓!

因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。只要保证下标j之前的dp[j]都是经过计算的就可以了。

遍历物品在外层循环,遍历背包容量在内层循环,状态如图:


遍历背包容量在外层循环,遍历物品在内层循环,状态如图:

看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。

最后,又可以出一道面试题了,就是纯完全背包,要求先用二维dp数组实现,然后再用一维dp数组实现,最后在问,两个for循环的先后是否可以颠倒?为什么?这个简单的完全背包问题,估计就可以难住不少候选人了。

参考:动态规划:关于完全背包,你该了解这些!

相关文章

  • 动态规划1.2--背包问题之完全背包

    本文参考:动态规划:关于完全背包,你该了解这些![https://mp.weixin.qq.com/s?__biz...

  • 动态规划之背包问题(01背包,完全背包,多重背包)

    01背包 问题描述 有N个物品,每个物品的重量为weight[i],每个物品的价值为value[i]。现在有一个背...

  • 算法-动态规划-背包问题

    背包问题是基础的动态规划问题,包含了0-1背包,完全背包,多重背包等。 0-1背包 存在容量为 的背包 , 件体...

  • 背包问题

    背包问题属于典型的动态规划问题。这里我们将详细介绍0-1背包,完全背包和多重背包问题 一、 0-1背包 有N件物品...

  • 背包入门

    背包,是动态规划里一类典型的问题,主要有:01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,有依赖背...

  • 算法思想之动态规划(七)——背包问题

    前言 今天我们继续讨论经典的动态规划问题之背包问题。 背包问题 问题描述 一个背包有一定的承重capacity,有...

  • 动态规划之01背包和完全背包

    01背包问题(注意看注释) 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。每种物品仅...

  • 算法学习收藏

    动态规划问题 动态规划(最优子结构和重叠子问题的比较) 动态规划解决01背包问题 01背包问题 最优二叉查找树 《...

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • 经典动态规划:完全背包问题

    读完本文,你可以去力扣拿下如下题目: 518.零钱兑换II[https://leetcode-cn.com/pro...

网友评论

      本文标题:动态规划1.2--背包问题之完全背包

      本文链接:https://www.haomeiwen.com/subject/tnlilltx.html