主要理解得益于:https://blog.csdn.net/a784586/article/details/63262080
其通俗易懂的讲解着实厉害,部分内容也来自与这篇博文
动态规划
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中, 可能会有很多可行解,每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划可以将一个复杂问题分解问若干子问题,然后求解子问题,从而得到原始问题的解。
这本身是一种分治法的思想,但是动态规划分解后的子问题往往不是独立的,即下一个阶段的求解必须是建立在上一个子阶段的基础上的。可以简单理解为一个爬楼梯的过程,你要爬到第二格楼梯,一定要先爬第一格。
背包问题
有 n n 种重量和价值分别为
, valuei v a l u e i 的物品,假设有一个容量为 w w 的背包,求怎么样装这个背包,才能使得
不超过背包的总重量,并获得最大的价值 ∑n1ki∗valuei ∑ 1 n k i ∗ v a l u e i 。
这个问题确实很难,因为从物品的组合方式多种多样,我怎么知道该如何选才能达到最优?下面以一个简单的例子来说明动态规划在这里应该怎么用。
如上图,现在我们有一个能容纳重量为 w w 的背包,和5种物品
,直观上确实很难理解怎么直接放置才能实现价值最大化。
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 种物品在重量
条件下任意组合所能达到的最大化价值(好好理解一下这句话理解了背包问题基本没问题),则有