knapsack

作者: 卡卡西sisi | 来源:发表于2017-09-10 20:49 被阅读0次

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

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])>, 关键有两点:

  • 如何表示子问题(dp[i][j])
  • 找到状态方程

思维过程

最终的最优解就是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背包只是多重背包的一个特例而已,但两者背后的“思维过程”是一致的。同理,完全背包与多重背包非常类似(至于谁是谁的特例不好说),所以二者的基本解决方案是一致的。

相关文章

  • knapsack

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

  • 11.6

    Multiple knapsack problem Contents 1.problem introduction...

  • 动态规划中阶

    Question 1 Unbounded Knapsack! (无限背包) Given a set of 'n' ...

  • 01背包

    public class Knapsack_01 {public static int getBiggestVal...

  • Dynamic Programming -- Knapsack

    这是一道经典的dp问题。 问题描述:有一些货物,他们有自己的重量和价值,一艘船有最大载重量,要求给定货物和船的载重...

  • 【早安心语】

    【2020-6-3】 早安 春夏秋冬 He who carries his knapsack on his ba...

  • A trip to Kansas City ——knapsack

    Today is a Really great day That we stay in SCA. Also jus...

  • 0-1 knapsack

    递归 注释记忆化搜索 测试用例 背包大小5 耗时 添加记忆化搜索

  • 算法之背包问题

    背包问题(Knapsack problem) 背包问题是一种组合优化问题,为NP-C Problem 描述 给定一...

  • 遗传算法实践(三) 背包问题

    背包问题描述 背包问题(knapsack problem)是指从多种物品中选择几件物品装满背包。在不超过背包承受重...

网友评论

    本文标题:knapsack

    本文链接:https://www.haomeiwen.com/subject/hmmzjxtx.html