动态规划动态规划

knapsack

2017-09-10  本文已影响0人  卡卡西sisi

本文源于背包九讲,主要讲述最为基本的三种背包问题,并分析彼此之间的联系,最终找到一个“通用”的思维方式。首先会给出一个基本的解决方案,之后再思考如何“思考”出这种方案。

1,01背包

有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

基本思路

因为有N件物品,每件有两种选择,放或不放,以dp[i][j]表示前i件物品在体积j的背包中所获得的最大价值,得到简单关系: <dp[i][j] = max(dp[i-1][j], dp[i-1][j-c[i]]+w[i])>, 关键有两点:

思维过程

最终的最优解就是N个物品中选取M个的组合,只要找到特定的M个组合即可,这将是一个2^N的问题,问题太多,此时我们换个思路(关键来了),原问题为1,2,3...N, 最优解为n1,n2,n3...nM, 此时我们既不知道结尾的nM,也不知道开头的n1,那意味着我们要进行遍历,此时我们以结尾为例,假设他们以i结尾,即前i个物品所获得的最大值,此时再添加上限制条件j,从而得到子问题---dp[i][j]。
剩下的状态方程就显而易见了。

2,完全背包

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

基本思路

由于都是整数,所以每件物品的最高数目是有限制的(V/c[i]),看似“无限”的问题转化为“有限”,如果构造一个加长数组的话,就是01背包。但是我们还有更优的算法。

思维过程

不要考虑01背包,完全当作一个新的题目,还是先从最后的结果来推到。最优解必然是选了m件物品,每件有一定的数量,显然考虑组合的情况太多,换个思路,对于每件物品要么选了要么没选,自然为了确定最后一个被选的物品我们需要遍历,dp[i][j]表示前i件在体积j中的最优解。状态方程的思路任然是第i件要么在里面,要么不在里面(注意这里的“在里面”意味着可以有多件,与01中的“可选”,“可不选”区分),从而dp[i][j] = max(dp[i-1][j],dp[i][j-c[i]]+w[i]).

3, 多重背包

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

基本思路

好吧,和完全背包一模一样,转化为01背包即可。利用2进制可以进行简单的优化,就不多讲了。
<dp[i][j] = max(dp[i-1][j-k*c[i]]+k*w[i])> (0<=k<=n[i]), 当k=1时就是01背包问题,所以01背包只是多重背包的一个特例而已,但两者背后的“思维过程”是一致的。同理,完全背包与多重背包非常类似(至于谁是谁的特例不好说),所以二者的基本解决方案是一致的。

上一篇下一篇

猜你喜欢

热点阅读