背包问题九讲_背包问题

背包问题九讲

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

问题:

给定一个最大容量为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;又不…

Java Code Geeks通过Twitter赠送了免费的Sublime Text Editor许可

正在与您的重量级编辑斗争&#xff1f; 然后&#xff0c;我们特别为您准备了一些东西&#xff01; 我们正在举办比赛&#xff0c;免费赠送 kick-ass Sublime Text Editor 许可证 。 Sublime Text是用于代码&#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…

php根本自学不了,PHP开发自学还是培训?

员有两种&#xff0c;一种是会php的&#xff0c;一种是不会php的&#xff0c;今天我们不去说哪种开发语言好&#xff0c;哪种又不好&#xff0c;因为语言只是一种工具而已不管你是从IOS、.NET或其它语言进入这个行业&#xff0c;只要你在这个行业坚持多年&#xff0c;与php的感…

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

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

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

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

oracle agile 性能,Oracle Agile PLM安全漏洞(CVE-2016-3554)

Oracle Agile PLM安全漏洞(CVE-2016-3554)发布日期&#xff1a;2016-07-21更新日期&#xff1a;2016-07-25受影响系统&#xff1a;Oracle Supply Chain Products Suite 9.3.5Oracle Supply Chain Products Suite 9.3.4描述&#xff1a;CVE(CAN) ID: CVE-2016-3554Oracle Agile产…

java 挥发注解_Java的挥发性修饰符

java 挥发注解不久前&#xff0c;我写了一个Java servlet过滤器&#xff0c;该过滤器在其init函数中加载配置&#xff08;基于web.xml的参数&#xff09;。 筛选器的配置缓存在私有字段中。 我在字段上设置了volatile修饰符。 后来&#xff0c;当我检查Sonar公司以查看是否在代…

python 线程锁_python多线程编程(3): 使用互斥锁同步线程

问题的提出 上一节的例子中&#xff0c;每个线程互相独立&#xff0c;相互之间没有任何关系。现在假设这样一个例子&#xff1a;有一个全局的计数num&#xff0c;每个线程获取这个全局的计数&#xff0c;根据num进行一些处理&#xff0c;然后将num加1。很容易写出这样的代码&am…

Comnnect oracle,RAC监听日志与CRS日志

RAC监听日志&#xff1a;tnsname.oraCRS日志&#xff1a;位置&#xff1a;Oracle集群涉及的日志主要位于“$ORA_CRS_HOME/log”和“$ORACLE_HOME/log”目录中目录结构&#xff1a;tree -d $ORA_CRS_HOME/logtree -d $ORACLE_HOME/log禁止Clusterware在系统重启后自动启动&#…

python全栈开发百度云_价值2400 2016年11月全栈开发Flask Python Web 网站编程

01-计算机基础常识.mp4 02-Python语言概览、安装与运行.mp4 03-Python 变量、数据类型及存储.mp4 04-Python 常用数据类型概览.mp4 05-数值与字符串.mp4 06-列表list.mp4 07-字典表dict 与元组 tuple.mp4 08-文件与类型汇总.mp4 09-语句、表达式与if分支.mp4 10-循环语句.mp4 1…

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

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

如何在虚拟linux环境运行python_Conda(Python)虚拟环境不能从Windows移植到Linux

在我的Windows 10计算机上&#xff0c;我使用以下命令创建了一个虚拟环境&#xff1a;>conda env export > environment.yml 我尝试在Windows系统上使用yml文件重新创建虚拟环境&#xff0c;效果很好。然后我转学了环境.yml在我的Linux机器&#xff08;Ubuntu16.04.1&…

oracle两个表合并 sql,如何创建从两个表(Oracle DBMS)生成“合并”数据集的Select SQL语句?...

我最后做了两个步骤:第一步填充事件表1中的数据,第二步合并目标(第一步中的数据集)和另一个源之间的数据。请原谅我,因为法律原因,我不得不混淆表名并省略下面代码中的一些列。下面是SQL:INSERT INTO EVENTS_TARGET (VEHICLE_ID,EVENT_TYPE_ID,CLIENT_ID,EVENT_DATE,CREATED_DA…

php毕业设计遇到的问题,常见问题_php毕业设计_php课程设计_php大作业_原创作品下载网...

一、我们怎么交易&#xff1f;答&#xff1a;本站采用在线支付的方式&#xff0c;每个产品页面都有一个付款按钮&#xff0c;亲在线付款后页面会显示一个“订单号”&#xff0c;根据这个订单号在本站的下载页面(见顶部菜单)下载相应程序&#xff0c;注意&#xff0c;亲要在30分…

git maven 发布_Maven Git发布

git maven 发布在开始这篇文章之前&#xff0c;我需要指出我在去年才开始认真地与Git合作 。 不幸的是&#xff0c;我从事的许多项目仍在使用SVN或CVS&#xff0c;但现在我终于开始使用Git了 。 在过去的几年中&#xff0c;我使用Maven Release Plugin完成了许多软件发行。 我…

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

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

php static 访问,使用PHP访问Static方法的最佳方法

这是我的课堂财产private $my_paths array(imagemagick > E:\Server\_ImageOptimize\ImageMagick,pngcrush > E:\Server\_ImageOptimize\pngCrush\pngcrush.exe,jpegtran > E:\Server\_ImageOptimize\jpegtran\jpegtran.exe,gifsicle > E:\Server\_ImageOptimize\…

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

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

Java:Speedment 3.2的发布–现在启用轻量级数据库微服务

几种传统的ORM不能完全遵循Java模块封装&#xff08;JPMS&#xff09;。 这通常意味着在部署微服务时会使用很多不必要的文件和类。 最新的主要版本3.2的开源 Speedance通过引入模块系统支持来解决此问题&#xff0c;该模块支持对云应用程序进行有效部署并提供更严格的API。 …