背包问题九讲_背包问题
背包问题九讲
我发现背包问题既棘手又有趣。 我敢肯定,如果您正在访问此页面,您已经知道了问题说明,但是只是为了完成本章:
问题:
给定一个最大容量为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(列)的背包中。 不。 第一项的权重为5。因此,让我们填写0。实际上,直到到达第5列(权重5),我们才能填写任何内容。
- 一旦我们到达第一行的第5列(代表权重5),这意味着我们可以容纳第1项。让我们在此处填写10(请记住,这是一个Value数组):
- 继续,对于权重6(第6列),我们是否可以容纳剩余重量为1(重量–该项目的重量=> 6 – 5)的任何其他东西。 嘿,记住,我们在第一个项目上。 因此,从直觉上讲,该行的其余部分也将是相同的值,因为我们无法为已获得的额外重量添加任何其他项目。
- 因此,当我们到达第三行的第4列时,会发生下一个有趣的事情。 当前的跑步重量为4。
我们应检查以下情况。
- 我们可以容纳项目2 –是的,我们可以。 项目2的权重为4。
- 如果没有第2项,当前重量的值是否会更高? –检查上一行是否具有相同的重量。 不。 前一行*的内容为0,因为我们无法容纳重量为4的商品1。
- 我们是否可以容纳两个重量相同的物品,以使价值最大化? - 不。 减去Item2的权重后的剩余权重为0。
为什么要上一行?
仅仅是因为权重为4的前一行本身是一个较小的背包解决方案,它给出了该权重在该点之前可以累积的最大值(遍历所有项目)。
举例来说,
- 当前项目的值= 40
- 当前商品的重量= 4
- 剩下的权重= 4 – 4 = 0
- 检查上面的行(如果是项目1,则检查上面的项目;如果其余的行,则检查累积最大值)。 对于剩余重量0,我们是否可以容纳项目1? 简而言之,对于给定的重量,上一行是否有任何值?
计算如下:
- 不带此项,取相同重量的最大值:
previous row, same weight = 0=> V[item-1][weight]
- 取当前商品的价值+我们可以用剩余重量容纳的价值:
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)。
- 下一个也是最重要的事件发生在第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.
因此,计算公式为:
- 不带此项,取相同重量的最大值:
previous row, same weight = 10
- 取当前商品的价值+我们可以用剩余重量累计的价值:
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
背包问题九讲
背包问题九讲_背包问题相关推荐
- 背包问题九讲 v1.0
背包问题九讲 v1.0 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
- [转载学习] 背包问题九讲
背包问题九讲 v1.0 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
- 背包问题九讲学习小记
前言 有些大佬小学就啃完背包问题九讲了,%%%%%. 细节落实要细致. 原目录(大致意思) 1 01背包 2完全背包 3多重背包 4 123讲的综合 5二维费用的背包问题 6分组背包 7依赖性背包 8 ...
- python 完全背包问题_背包问题九讲python3实现
背包九讲是动态规划思想的经典呈现,找了许久没有完整的python3实现,趁机总结一下. 1.0-1背包问题 二维DP数组解法: # n, v分别代表物品数量,背包容积 n, v = map(int, ...
- 【动态规划】之背包问题九讲
背包问题 01背包 01背包朴素 01背包优化 完全背包 完全背包朴素 完全背包一级优化 完全背包二级优化 多重背包 多重背包朴素 多重背包二进制优化 多重背包单调队列优化 分组背包 混合背包 二维费 ...
- 背包九讲 ----- 01背包问题模版
01背包问题 题意 给定N件物品和一个容量为V的背包 每件物品具有价值和体积两个属性,且每件物品选择次数小于等于1 计算出背包所能够存放的最大价值 题解(二维dp) 用 f[i][j]f[i][j]f ...
- 背包九讲之一:01背包问题
文章目录 说明: 01背包问题 题目 基本思路 初始化的细节问题 优化空间复杂度 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添 ...
- 背包九讲之二:完全背包问题
文章目录 说明: 完全背包问题 题目 基本思路 一个简单有效的优化 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添翼:背包九讲, ...
- dd大牛的背包九讲-背包问题汇总
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
最新文章
- 6.SQL Server Sql语句
- mysql 导入导出摘要
- XP Sp2下双机通过无线网卡实现Internet共享
- 安装你自己的perl modules
- vba 字体颜色_VBA第一章自检,23关,你能破吗?
- Xstream 学习地址
- WinForm公共控件
- SQL注入漏洞(类型篇)
- 软考--软件设计师--下午题数据库设计
- 游程编码run length code
- 西门子1200的实例
- Vue实现 TodoList
- 威胁web应用安全的错误
- vcenter server 添加主机失败
- win10重装系统后连不上公司服务器,电脑重装win10系统连不上网,怎么办?
- java similarity_Java WordNet Similarity
- 关系型到文档型的跨越:颠覆你对数据库数据模型的认识
- java基于jsp+ssm的医药销售管理系统进销存
- Aigtek全球供应水声信号功率放大器
- 前端知识点总结——H5
热门文章
- JoyOI(TYVJ)1061-Mobile Service【线性dp】
- 二分二题-P1678,P3902【二分,LIS】
- 【DP】Mobile Service(jzoj 1327)
- 【并查集】【图论】旅行(ssl 1312)
- 求凸函数极值 CSF迭代法(雾)
- Sentinel(二十一)之Sentinel Dashboard控制台日志路径设置
- SpringBoot2.1.9 Mybatis多数据源配置
- 青蛙跳台阶的问题——Fibonacci
- 2019蓝桥杯省赛---java---B---3(数列求值)
- 蓝桥杯JAVA---2013---B----世纪末的星期