动态规划算法之01背包问题-我对递推关系式的理解

一、前提

如果你已经仔仔细细读懂了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 件商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,也就是物品组合总价值更大的那个,即

            V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }

其中V(i-1,j)表示装得下但不装;

而V(i-1,j-w(i))+v(i) 表示装了第i个商品,既然装了,当前背包容量又是j,那么j中必定有w(i)个容量给了第i个背包,而剩余j-w(i)个容量用来装除了第i件物品的其他所有物品rest,这其他所有物品rest是一个只能在前i-1个物品中挑选的物品的集合。所以如果考虑要装这一步,只要再考虑V(i-1,j-w(i))这个子问题的最优解、再加上第i个物品的价值v(i)就可以了。我们知道V(i-1,j-w(i))这个子问题已经先计算好了,现在直接拿过来用,也就避免了重复计算,所以就达到了动态规划提高运算效率的目的。

由此可以得出递推关系式:

    1) j<w(i)      V(i,j)=V(i-1,j)

    2) j>=w(i)     V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }

猜你喜欢

转载自blog.csdn.net/qq_32919451/article/details/81153212