背包问题九讲_背包问题

背包问题九讲

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

问题:

给定一个最大容量为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行为例。 这仅表示房子中没有物品。 如果没有物品,您在背包里会做什么? 没事了! 全零。

Varray0

解:

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


    Varray1

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


    Varray2

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

我们应检查以下情况。

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

Varray3

为什么要上一行?

仅仅是因为权重为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.


    Varray4

因此,计算公式为:

  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的值:

Varray5

复杂

分析解决方案的复杂性非常简单。 我们只是在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

背包问题九讲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

一、什么是随机森林前面我们已经介绍了决策树的基本原理和使用。但是决策树有一个很大的缺陷&#xff1a;因为决策树会非常细致地划分样本&#xff0c;如果决策树分得太多细致&#xff0c;会导致其在训练集上出现过拟合&#xff0c;而如果决策树粗略地划分样本&#xff0c;又不…

http端口_PhpStorm 修改默认端口号63342

PhpStorm 修改默认端口号63342​blog.csdn.net关键词PhpStorm phpStorm phpstorm 修改默认端口号63342 8080 80步骤1.打开Settings2. Build, Execution, Deployment→Deployment3.点击添加&#xff0c;选择In place起一个名字&#xff08;可以随便起&#xff09;在Web server U…

rds mysql 磁盘空间,RDS MySQL 空间问题的原因和解决

other_size- 系统文件和临时文件使用空间data_size- 数据文件使用空间binlog_size- Binlog 文件占用空间注&#xff1a;获取实例诊断报告的步骤请参考如何访问RDS 实例诊断报告。2. 解决RDS 实例支持单独升级磁盘空间&#xff0c;升级磁盘空间是解决空间问题的有效方式之一。下…

微信小程序 全局变量异步函数_微信小程序【生命周期】

小程序分为应用、页面和组件三个部分&#xff0c;所以小程序的生命周期涉及以下应用的生命周期页面的生命周期组件的声明周期应用的生命周期对页面生命周期的影响应用的生命周期App() 函数用来注册一个小程序。接受一个 Object 参数&#xff0c;其指定小程序的生命周期回调等。…

Java / Spring:如何快速生成整个数据库CRUD REST API

随着时间的流逝&#xff0c;Spring框架已成为Java中使用最广泛的Web开发框架之一&#xff0c;这一点已变得显而易见。 在接下来的十年之际&#xff0c;Spring最受欢迎的模块Spring Boot刚刚进行了重大更新。 新的Spring Boot版本“ 2.2.0”和年份“ 2020”几乎完美匹配。 因此…

python界面长什么样图片_python界面是什么样的

安装完Python&#xff0c;在命令行输入“python”之后&#xff0c;如果成功&#xff0c;会得到类似于下面的窗口&#xff1a;可以看到&#xff0c;结尾有3个>符号&#xff08;>>>&#xff09;。>>>被叫做Python命令提示符&#xff08;prompt&#xff09;&…

python表格控件_python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例...

PyQt5表格控件QTableView简介 在通常情况下&#xff0c;一个应用需要和一批数据进行交互&#xff0c;然后以表格的形式输出这些信息&#xff0c;这时就需要用到QTableView类了&#xff0c;在QTableView中可以使用自定义的数据模型来显示内容&#xff0c;通过setModel来绑定数据…

Linux文件系统为,浅析Linux文件系统

原标题&#xff1a;浅析Linux文件系统一、文件系统层次分析由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层用户层最上面用户层就是我们日常使用的各种程序&#xff0c;需要的接口主要是文件的创建、删除、打开、关闭、写、读等。VFS层我…

求解出n以内所有能被5整除的正整数的乘积_所有最常见最经典的算法题都在这里了...

1、一群猴子排成一圈&#xff0c;按1&#xff0c;2&#xff0c;…&#xff0c;n依次编号。然后从第1只开始数&#xff0c;数到第m只,把它踢出圈&#xff0c;从它后面再开始数&#xff0c;再数到第m只&#xff0c;在把它踢出去…&#xff0c;如此不停的进行下去&#xff0c;直到…

linux lvm 系统快照,系统运维|在 LVM中 录制逻辑卷快照并恢复(第三部分)

LVM快照是以空间换时间时间的方式制作的lvm卷副本。它只在lvm中工作&#xff0c;并只在源逻辑卷发生改变时占用快照卷的空间。如果源卷的变化达到1GB这么大&#xff0c;快照卷同样也会产生这样大的改变。因而&#xff0c;对于空间有效利用的最佳途径&#xff0c;就是总是进行小…

python语言变量随时声明_2. Go语言五种变量创建的方法

对于只有 Python 语言经验的朋友&#xff0c;也许会不太理解声明这个词&#xff0c;在 Python 中直接拿来就用&#xff0c;也不用声明类型啥的。 Go 语言是静态类型语言&#xff0c;由于编译时&#xff0c;编译器会检查变量的类型&#xff0c;所以要求所有的变量都要有明确的类…

会java需要多久能学会python_java好学吗?零基础学java要多久?

java好学吗&#xff1f;零基础学java要多久&#xff1f; 时间&#xff1a;2019-05-21 来源&#xff1a;华清远见 2019年3月&#xff0c;tiOBE 公布了编程语言排行榜&#xff0c;正如官方所说&#xff0c;本月的排名几乎没有任何有趣的变化&#xff0c;排名前十的依然是&…

jboss架构_检查Red Hat JBoss BRMS部署架构的规则和事件(第二部分)

jboss架构&#xff08;文章来宾与北美红帽公司高级中间件顾问约翰赫洛克 &#xff08; John Hurlocker&#xff09;合着&#xff09; 在这周的技巧中&#xff0c;我们将放慢速度&#xff0c;并仔细研究可能的Red Hat JBoss BRMS部署体系结构。 在谈论部署体系结构时&#xff…

TestNG中的参数化– DataProvider和TestNG XML(带有示例)

测试自动化&#xff0c;或所谓的自动化测试&#xff0c;并不像听起来那样容易。 必须考虑所有可能的用户交互的所有排列和组合&#xff0c;并且在此基础上&#xff0c;您将必须创建测试脚本以通过多种浏览器和OS组合来验证Web应用程序。 这就是参数化在Selenium自动化测试中起关…

zbrush 添加纹理贴图_想学习3D游戏模型,3Dmax、MAYA和ZBrush都需要掌握吗?

想从事游戏行业的建模的话&#xff0c;模型和贴图的知识都得学&#xff0c;MAYA和3DMAX只能说是基本要学的&#xff0c;Zbrush能够提升个人价值&#xff0c;之后能给你建好的模型做出好看的贴图&#xff0c;才能算是一个游戏建模方面能干活的合格从业人员。新手入门的话&#x…

file.getpath_Java中File的getPath(),getCanonicalPath()和getAbsolutePath()之间的区别...

file.getpathFile API在Java中非常重要&#xff0c;因为它使文件系统可以访问Java程序。 尽管Java的文件API丰富&#xff0c;但是使用它们时仍需要了解很多细节。 关于文件路径的常见查询程序员之一是getPath() &#xff0c; getCanonicalPath()和getAbsolutePath()方法之间的区…

linux 在线帮助,linux获取在线帮助

Linux系统的帮助文档非常丰富。帮助手册提供命令的使用说明。比如你若是想了解ls命令的用法&#xff0c;只需运行&#xff1a;$ man ls帮助手册旨在提供基础知识和参考信息&#xff0c;有时会有一些实例和交叉索引&#xff0c;但是基本没有那种教程式的文档。帮助手册会按系统排…

linux中samba详解,详解linux系列之samba的安装及配置

上篇博文中我介绍了FTP&#xff0c;今天我们来介绍一下samba实现文件共享。这个比FTP更好点&#xff0c;因为对用户的权限可以通过samba权限和系统权限交叉使用&#xff0c;取最严格的。可以让windows更容易的从linux系统上存取文件&#xff0c;还有samba也可以让linux上面的打…

使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务

微服务架构不是免费的午餐 &#xff01; 微服务需要解耦&#xff0c;灵活&#xff0c;操作透明&#xff0c;数据感知和弹性。 过去几年的大多数材料仅讨论具有紧密耦合且不可扩展的技术&#xff08;如REST / HTTP&#xff09;的点对点体系结构。 这篇博客文章介绍了Apache Kafk…

单片机控制三相异步电动机正反转c语言程序,请用PLC控制一台普通三相异步电动机的正反转控制,设计其控制程序梯形图及主电路...

PLC的编程方法及步骤。总的步骤主要有三步&#xff1a;一、根据电路图选择电器元件及PLC的型号&#xff0c;其中包括确定PLC的输入输出点位、确定PLC的输出类型&#xff0c;也需考虑某些功能是否能扩展、价格等&#xff1b;二、设计好PLC控制的外围元器件的原理图。这里面包括有…