一、前提
如果你已经仔仔细细读懂了01背包问题的题意,且对动态规划算法的思想有了一定的了解,那就继续吧。如果没有,先看看我转过的关于01背包问题的另一篇博客。
二、分析与理解
给定的物品数量为n,总容量为capacity。把背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选),Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积(重量),我们知道这个问题的目标是求max(V1X1+V2X2+…+VnXn),当然需要满足约束条件W1X1+W2X2+…+WnXn<=capacity。
由于我们是这样解决的,面对n件物品,每一次只对前1、2、3......直到前n件物品考虑,这个过程用变量 i 控制(1≤i≤n);而每次考虑前 i 件物品时,要从背包容量为1、2、3......直到capacity时一步步考虑,这个过程用变量 j 控制(1≤j≤capacity)。所以定义一个二维数组 V(i,j) 表示当前背包容量为 j,前 i 个物品最佳组合所取得的最大价值。
接下来寻找递推关系式,我觉得这是解决问题最关键的部分:
求每一项 V(i,j)时,也就是面对前i件物品、背包容量只有j,有两种可能性:
第一,包的容量 j 比第 i 件物品重量w(i)小,装不下,只能不装,那么此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
第二,还有足够的容量可以装第 i 件商品,但装