背包问题之:01背包、完全背包、多重背包(本文源码可求物品放置列表)

本文介绍了动态规划在解决背包问题中的应用,包括01背包、完全背包和多重背包问题。通过实例阐述动态规划如何逐步找到最优解,并给出了相应的状态转移方程和Python代码实现。对于背包问题的理解和算法实践提供了清晰的指导。
摘要由CSDN通过智能技术生成

主要理解得益于:https://blog.csdn.net/a784586/article/details/63262080
其通俗易懂的讲解着实厉害,部分内容也来自与这篇博文



动态规划

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中, 可能会有很多可行解,每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划可以将一个复杂问题分解问若干子问题,然后求解子问题,从而得到原始问题的解。
这本身是一种分治法的思想,但是动态规划分解后的子问题往往不是独立的,即下一个阶段的求解必须是建立在上一个子阶段的基础上的。可以简单理解为一个爬楼梯的过程,你要爬到第二格楼梯,一定要先爬第一格。


背包问题

n n 种重量和价值分别为 w e i g h t i valuei v a l u e i 的物品,假设有一个容量为 w w 的背包,求怎么样装这个背包,才能使得 1 n k i w e i g h t i k i 0 不超过背包的总重量,并获得最大的价值 n1kivaluei ∑ 1 n k i ∗ v a l u e i
这个问题确实很难,因为从物品的组合方式多种多样,我怎么知道该如何选才能达到最优?下面以一个简单的例子来说明动态规划在这里应该怎么用。
这里写图片描述
如上图,现在我们有一个能容纳重量为 w w 的背包,和5种物品 a b c d e ,直观上确实很难理解怎么直接放置才能实现价值最大化。

1、假设这里每种物品至多只能取一次,并且我们先不管这个背包真实容量11,我们假设这个背包容量其实只有1,并且此时此刻可选物品也只有a,显然,在这种情况下,a能放入这个背包,并得到了价值1。这时候假设我们可选物品多了一件b,容量仍为1,但b的重量大于1,放不下,与此类似,我们可知,即使可选物品变成5件,因为其他物品的重量都超过了当前这个背包容量1,我们可放的物品仍然只有a,总的价值还是为1。

2、这时候我们假设背包容量变成了2,一开始还是只能放a,得到的价值为1。这时候,假设b也可选了,即此时ab均可选,那么因为b的重量小于等于2,此时价值最大的方式就是把刚刚放的a拿出来,放入b,就可以得到价值6。当 cde c d e 也可选,因为容量超限,显然不能再有更好的放置方案。

3、接着,我们假设背包容量变成了3,起初只有a一种物品,那么能放入,得到的价值为1,这时候再来一件b,a+b仍然不超过容量3,因此可以得到价值7

我发现这个例子要举出点鲜明的变化至少要举到重量变成5的时候,但那时候文字太多了。我就文字补一波,希望看到这里的人能脑补出来。我们假设在重量为5的情况下,一件件看物品 abcde a b c d e 物品,开始只有a,那么放得下,得到价值1。只有ab,也放得下,得到价值7。但出现c的时候,问题来了,因为c一个的价值就超过了ab,而且重量不超限,最好的方法就是把ab都干掉,只放c。当放了c,后来再看de,因为两个都超限,最终也只放c获得了最大价值18

上面的内容非常废话,但却透露了一个思想,甚至隐含了一个公式。
我们假设 opt(i,w) o p t ( i , w ) 为前 i i 种物品在重量 w 条件下任意组合所能达到的最大化价值(好好理解一下这句话理解了背包问题基本没问题),则有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值