ACM总结八

完全学习总结

①与零一背包不同的是,零一背包中的物品是不可以重复拿取的,只可以拿取当前物品或者不拿取当前物品,不可以拿取多个,完全背包的物品是可以任意拿取多个的来构成不超过背包容量并且构成的总价值是最大的
② 首先我们是可以使用试探的方式来拿取物品的,对于当前的物品我们可以不拿取,拿取一个,拿取两个…直到不能够拿取当前物品了,这种试探的思维我们是可以使用深度优先搜索来进行解决的,
但是时间复杂度可能有点高,对于这种经典的求解最大值的问题我们使用动态规划来进行解决
③ 动态规划的核心是找到dp公式或者状态转移的方程,理解清楚中间的过程是怎么样进行变化的,
因为动态规划总是要利用到之前历史上的最佳方案,所以dp数组里面存储的肯定是历史上存储的最佳方案,
一开始的时候我们是可以借助excel表格来帮助我们理解dp数组是怎样生成的

在这里插入图片描述

在这里插入图片描述
④ 我们可以这样想:当前我的背包容量有多少,而且我可以选择的物品的范围是什么,那么这两个变量就可以确定一个值了,我们可以计算出当前背包容量对于当前可以选择的物品范围构成的最大价值

所以借助excel表格来帮助我们理解dp表的生成,

⑤ 采用的策略是:对于当前的物品我们是可以选择不拿取的,因为可以重复拿取那么我们是可以拿取当前物品的1,2,3…k倍的,

并且k * w[i] <= W
k为当前的倍数,w[i]为当前物品的质量,W为剩余物品的质量,
拿取当前物品的k倍之后那么剩余的容量拿取的最大价值我们应该在上一行中对应的剩余物品质量的列去找,
把不拿取当前物品,拿取1,2,3…k倍中计算出的价值进行比较在这几个中求出最大值,
这个最大值就是当前单元格的对应的dp数组的值,
那么当循环结束之后dp数组的最后一个元素那么肯定就是我们需要求解的背包容量为w拿取物品的最大价值,直接返回就可以了
⑥ 此外在生成dp表的过程中更需要先对dp数组的第一行与第一列进行初始化,对于第一行判断我们可以拿取当前物品多少个,那么就可以加上这个物品的多少倍的价值,对于dp数组的第一列我们都设置为零,因为当前的背包容量为零我们不可以拿取任何的物品,这个时候可以不对dp数组的第一列进行初始化,因为数组元素的默认值为零
⑦ 其中我感觉背包问题最重要的是:把横坐标确定为背包容量,纵坐标确定为当前可以选择的物品的范围那么不管是何种背包问题我都可以借助excel表格来进行dp数组生成过程中单元格数字的填写,
理解好单元格的意义并且单元格的上一行的值代表的是什么意思,在填写excel表格的时候那么我们对于背包问题的理解就比较深刻了,可以发现在填写dp表格的过程中行数在递增的过程中那么其中可以选择的物品的范围也在变化,
其实这实际上也是在当前可以选择的物品范围内组合选择最佳方案的过程,等到填完表格中的一部分理解清楚其中的过程那么写代码就不是很困难了,所以excel表格非常重要

感谢https://blog.csdn.net/qq_39445165/article/details/84334970

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值