背包问题九讲

我发现背包问题既棘手又有趣。 我敢肯定,如果您正在访问此页面,您已经知道了问题说明,但是只是为了完成本章:

问题:

给定一个最大容量为W和N的背包,每个背包都有自己的值和重量,将它们放入背包中,使最终内容物具有最大值。 kes!

  • 链接到Wiki中的问题页面

这是解释问题的一般方法-考虑一个小偷进入家中抢劫,他背着背包。 家里有固定数量的物品-每个物品都有自己的重量和价值-珠宝首饰,重量和重量比桌子高,价值少,但重量重。 为了给火上加油,小偷有一个老式的背包,容量有限。 显然,他不能将桌子分成两半,也不能将珠宝分成3/4分。 他要么接受要么离开。

范例:

Knapsack Max weight     :       W = 10 (units)Total items             :       N = 4Values of items         :       v[] = {10, 40, 30, 50}Weight of items         :       w[] = {5, 4, 6, 3}

粗略看一下示例数据可知,在最大权重为10的情况下,我们可以容纳的最大值为50 + 40 = 90(权重为7)。

方法:

最佳解决方法是使用动态编程-解决较小的背包问题,然后将其扩展为较大的问题。

让我们构建一个名为V(值数组)的Item x权重数组:

V[N][W] = 4 rows * 10 columns

此矩阵中的每个值代表一个较小的背包问题。

基本案例1 :让我们以第0列为例。 这仅意味着背包的容量为0。 你能在他们身上抱什么? 没有。 因此,让我们用0填充它们。

基本情况2 :让我们以0行为例。 这仅表示房子中没有物品。 如果没有物品,您在背包里会做什么? 没事了! 全零。

解:

  1. 现在,让我们开始逐行填充数组。 第1行和第1列是什么意思? 给定第一个项目(行),您能否将其容纳在容量为1(列)的背包中。 不。 第一项的权重为5。因此,让我们填写0。实际上,直到到达第5列(权重5),我们才能填写任何内容。
  2. 一旦我们到达第一行的第5列(代表权重5),这意味着我们可以容纳第1项。让我们在此处填写10(请记住,这是一个Value数组):

  3. 继续,对于权重6(第6列),我们是否可以容纳剩余重量为1(重量–该项目的重量=> 6 – 5)的任何其他东西。 嘿,记住,我们在第一个项目上。 因此,从直觉上讲,该行的其余部分也将是相同的值,因为我们无法为已获得的额外重量添加任何其他项目。

  4. 因此,当我们到达第三行的第4列时,会发生下一个有趣的事情。 当前的跑步重量为4。

我们应检查以下情况。

  1. 我们可以容纳项目2 –是的,我们可以。 项目2的权重为4。
  2. 如果没有第2项,当前重量的值是否会更高? –检查上一行是否具有相同的重量。 不。 前一行*的内容为0,因为我们无法容纳重量为4的商品1。
  3. 我们是否可以容纳两个重量相同的物品,以使价值最大化? - 不。 减去Item2的权重后的剩余权重为0。

为什么要上一行?

仅仅是因为权重为4的前一行本身是一个较小的背包解决方案,它给出了该权重在该点之前可以累积的最大值(遍历所有项目)。

举例来说,

  1. 当前项目的值= 40
  2. 当前商品的重量= 4
  3. 剩下的权重= 4 – 4 = 0
  4. 检查上面的行(如果是项目1,则检查上面的项目;如果其余的行,则检查累积最大值)。 对于剩余重量0,我们是否可以容纳项目1? 简而言之,对于给定的重量,上一行是否有任何值?

计算如下:

  1. 不带此项,取相同重量的最大值:

    previous row, same weight = 0=> V[item-1][weight]
  2. 取当前商品的价值+我们可以用剩余重量容纳的价值:
    Value of current item
    + value in previous row with weight 4 (total weight until now (4) - weight of the current item (4))=> val[item-1] + V[item-1][weight-wt[item-1]]

    两者之间的最大值为40(0和40)。

  3. 下一个也是最重要的事件发生在第9列和第2行。这意味着我们的权重为9,并且有两项。 查看示例数据,我们可以容纳前两个项目。 在这里,我们考虑几件事:
    1. The value of the current item = 40
    2. The weight of the current item = 4
    3. The weight that is left over = 9 - 4 = 5
    4. Check the row above.  At the remaining weight 5, are we able to accommodate Item 1.

因此,计算公式为:

  1. 不带此项,取相同重量的最大值:

    previous row, same weight = 10
  2. 取当前商品的价值+我们可以用剩余重量累计的价值:
    Value of current item (40)
    + value in previous row with weight 5 (total weight until now (9) - weight of the current item (4)) = 10

    10比50 = 50。

解决所有这些较小的问题后,我们只需要返回权重为10的V [N] [W] –项目4的值:

复杂

分析解决方案的复杂性非常简单。 我们只是在N => O(NW)的循环中有一个W循环

实现方式:

这是Java中的强制性实现代码:

class Knapsack {public static void main(String[] args) throws Exception {int val[] = {10, 40, 30, 50};int wt[] = {5, 4, 6, 3};int W = 10;System.out.println(knapsack(val, wt, W));}public static int knapsack(int val[], int wt[], int W) {//Get the total number of items. //Could be wt.length or val.length. Doesn't matterint N = wt.length; //Create a matrix. //Items are in rows and weight at in columns +1 on each sideint[][] V = new int[N + 1][W + 1]; //What if the knapsack's capacity is 0 - Set//all columns at row 0 to be 0for (int col = 0; col <= W; col++) {V[0][col] = 0;}//What if there are no items at home.  //Fill the first row with 0for (int row = 0; row <= N; row++) {V[row][0] = 0;}for (int item=1;item<=N;item++){//Let's fill the values row by rowfor (int weight=1;weight<=W;weight++){//Is the current items weight less//than or equal to running weightif (wt[item-1]<=weight){//Given a weight, check if the value of the current
//item + value of the item that we could afford
//with the remaining weight is greater than the value
//without the current item itselfV[item][weight]=Math.max (val[item-1]+V[item-1][weight-wt[item-1]], V[item-1][weight]);}else {
//If the current item's weight is more than the
//running weight, just carry forward the value
//without the current itemV[item][weight]=V[item-1][weight];}}}//Printing the matrixfor (int[] rows : V) {for (int col : rows) {System.out.format("%5d", col);}System.out.println();}return V[N][W];}}

翻译自: https://www.javacodegeeks.com/2014/07/the-knapsack-problem.html

背包问题九讲

背包问题九讲_背包问题相关推荐

  1. 背包问题九讲 v1.0

    背包问题九讲 v1.0 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...

  2. [转载学习] 背包问题九讲

    背包问题九讲 v1.0 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...

  3. 背包问题九讲学习小记

    前言 有些大佬小学就啃完背包问题九讲了,%%%%%. 细节落实要细致. 原目录(大致意思) 1 01背包 2完全背包 3多重背包 4 123讲的综合 5二维费用的背包问题 6分组背包 7依赖性背包 8 ...

  4. python 完全背包问题_背包问题九讲python3实现

    背包九讲是动态规划思想的经典呈现,找了许久没有完整的python3实现,趁机总结一下. 1.0-1背包问题 二维DP数组解法: # n, v分别代表物品数量,背包容积 n, v = map(int, ...

  5. 【动态规划】之背包问题九讲

    背包问题 01背包 01背包朴素 01背包优化 完全背包 完全背包朴素 完全背包一级优化 完全背包二级优化 多重背包 多重背包朴素 多重背包二进制优化 多重背包单调队列优化 分组背包 混合背包 二维费 ...

  6. 背包九讲 ----- 01背包问题模版

    01背包问题 题意 给定N件物品和一个容量为V的背包 每件物品具有价值和体积两个属性,且每件物品选择次数小于等于1 计算出背包所能够存放的最大价值 题解(二维dp) 用 f[i][j]f[i][j]f ...

  7. 背包九讲之一:01背包问题

    文章目录 说明: 01背包问题 题目 基本思路 初始化的细节问题 优化空间复杂度 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添 ...

  8. 背包九讲之二:完全背包问题

    文章目录 说明: 完全背包问题 题目 基本思路 一个简单有效的优化 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添翼:背包九讲, ...

  9. dd大牛的背包九讲-背包问题汇总

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

最新文章

  1. 6.SQL Server Sql语句
  2. mysql 导入导出摘要
  3. XP Sp2下双机通过无线网卡实现Internet共享
  4. 安装你自己的perl modules
  5. vba 字体颜色_VBA第一章自检,23关,你能破吗?
  6. Xstream 学习地址
  7. WinForm公共控件
  8. SQL注入漏洞(类型篇)
  9. 软考--软件设计师--下午题数据库设计
  10. 游程编码run length code
  11. 西门子1200的实例
  12. Vue实现 TodoList
  13. 威胁web应用安全的错误
  14. vcenter server 添加主机失败
  15. win10重装系统后连不上公司服务器,电脑重装win10系统连不上网,怎么办?
  16. java similarity_Java WordNet Similarity
  17. 关系型到文档型的跨越:颠覆你对数据库数据模型的认识
  18. java基于jsp+ssm的医药销售管理系统进销存
  19. Aigtek全球供应水声信号功率放大器
  20. 前端知识点总结——H5

热门文章

  1. JoyOI(TYVJ)1061-Mobile Service【线性dp】
  2. 二分二题-P1678,P3902【二分,LIS】
  3. 【DP】Mobile Service(jzoj 1327)
  4. 【并查集】【图论】旅行(ssl 1312)
  5. 求凸函数极值 CSF迭代法(雾)
  6. Sentinel(二十一)之Sentinel Dashboard控制台日志路径设置
  7. SpringBoot2.1.9 Mybatis多数据源配置
  8. 青蛙跳台阶的问题——Fibonacci
  9. 2019蓝桥杯省赛---java---B---3(数列求值)
  10. 蓝桥杯JAVA---2013---B----世纪末的星期