背包问题(01背包问题例题讲解)
背包问题(01背包问题例题讲解)2021-04-07 18:30·人民邮电出版社无论是Facebook、Google、Microsoft,还是百度、阿里、腾讯……每年大厂面试时总会考察动态规划问题。而作为动态规划类问题中非常重要的一个类别——背包问题,慢慢地走到了舞台中央成为面试高频题中的"佼佼者"。
背包问题的一个例子:应该选择哪些盒子,才能使价格尽可能地大,而保持重量小于或等于15 kg?图片源自:维基百科-背包问题
随着面试算法岗位的人数不断增多,背包问题也不像当初那样"天真无邪",如今也是 "套路" 满满。0-1背包,多重背包,完全背包等背包问题,经历大厂面试官变题型、换表达、改套路之后,让无数面试者短时间内无法找到问题需求,内心os"这题想干嘛?"。很多人都在背包问题上,跪了......
图片源自:谷歌图片搞笑表情包
背包问题看起来是个简单的数学问题,但背后的算法逻辑相当复杂,短时间分析不出来,基本上就凉凉了。很多人在面试过程中可能就是因为没有做出一道背包问题,而被大厂拒之门外。如何才能快速掌握背包问题的解题套路,成为大厂offer收割机呢?
跟人邮君一起快速掌握"背包问题"解题技巧,go!趣学算法(异步图书出品)¥77.4购买什么背包问题?
背包问题(Knapsack problem)是一种组合优化的NP完全问题。
问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V。背包问题有哪些?
背包问题分为以下五种:
0-1背包问题
多重背包问题
完全背包问题
分组背包问题
混合背包问题学习背包问题有什么作用?
背包问题是互联网公司最常见的算法面试题,由于其代码量较小而思维量较大的特点而深受面试官的钟爱。此外,背包问题是学习动态规划的基础,是动态规划入门阶段必须要熟练掌握的问题。这也是为什么背包问题日渐成为大厂面试高频题中的"佼佼者"的原因所在。熟练掌握0-1 背包,多重背包,完全背包等背包问题的解法,可以加深初学者对于动态规划中状态的理解。0-1背包问题
问题描述
给定n个物品的权重和值,将这些物品放在容量为W的背包中,以在背包中获得最大的总价值。换句话说,给定两个整数数组value[0..n-1]和weight[0..n-1],它们分别表示与n个项目相关联的值和权重。还给定代表背包容量的整数W,找出val[]的最大值子集,以使该子集的权重之和小于或等于W。本题中value[]={60,100,120},weight[]={10,20,30},
W=50。
解题方法方法1:通过蛮力算法或穷举搜索进行递归。
方法:一种简单的解决方案是考虑所有项目子集,并计算所有子集的总重量和价值。仅考虑总权重小于W的子集。从所有此类子集中,选择最大值子集。
最佳子结构:要考虑项目的所有子集,每个项目可能有两种情况。
情况1:该项目包含在最佳子集中。
情况2:该商品未包含在最佳组合中。
因此,可以从n个项目中获得的最大值是以下两个值中的最大值。
通过n-1个项和W权重(不包括第n个项)获得的最大值。
第n个项目的值加上n-1个项目获得的最大值,W减去第n个项目(包括第n个项目)的权重。
如果第n个项目的权重大于 W,则第n个项目不能包括在内,情况1是唯一的可能性。
下面是上述方法的python代码实现defknapSack(W,wt,val,n):#BaseCase ifn==0orW==0: return0#Ifweightofthenthitemis#morethanKnapsackofcapacityW,#thenthisitemcannotbeincluded#intheoptimalsolution if(wt[n-1]>W): returnknapSack(W,wt,val,n-1)#returnthemaximumoftwocases:#(1)nthitemincluded#(2)notincluded else: returnmax( val[n-1]+knapSack( W-wt[n-1],wt,val,n-1), knapSack(W,wt,val,n-1))#endoffunctionknapSack#DriverCodeval=[60,100,120]wt=[10,20,30]W=50n=len(val)printknapSack(W,wt,val,n)
复杂度分析
时间复杂度: O()。
由于存在多余的子问题。
辅助空间: O(1)。
由于没有额外的数据结构用于存储值。方法2:通过自下而上的方式构造临时数组K[][],可以避免重新计算相同子问题。
方法:在动态编程中,我们将考虑与递归方法中提到的情况相同的情况。在DP[][]表中,让我们将从1到W的所有可能的权重视为列,并将权重保留为行。考虑到从1到第i的所有值,状态DP[i][j]将表示j-weight的最大值。因此,如果我们考虑wi(ith行中的权重),则可以将其填充到weight value> wi的所有列中。
现在可以发生两种可能性:
在给定的列中填写wi。
不要在给定的列中填写wi。
现在,我们必须最大限度地考虑这两种可能性,形式上,如果我们不在jth列中填充ith权重,则DP[i][j]状态将与DP[i-1][j]相同,但是如果我们填充权重,则DP[i][j]将等于wi的值+上一行中权重为j-wi的列的值。因此,我们将这两种可能性中的最大值用于填充当前状态。
下面是上述方法的python代码实现:defknapSack(W,wt,val,n): K=[[0forxinrange(W+1)]forxinrange(n+1)] #BuildtableK[][]inbottomupmanner foriinrange(n+1): forwinrange(W+1): ifi==0orw==0: K[i][w]=0 elifwt[i-1]<=w: K[i][w]=max(val[i-1] +K[i-1][w-wt[i-1]], K[i-1][w]) else: K[i][w]=K[i-1][w] returnK[n][W]#Drivercodeval=[60,100,120]wt=[10,20,30]W=50n=len(val)print(knapSack(W,wt,val,n))
复杂度分析
时间复杂度:O(N * W)。
其中N是重量元素的数量,W是容量。对于每个重量元素,我们遍历所有重量容量1 <= w <= W。
辅助空间:O(N * W)。
使用大小为"N * W"的二维数组。方法3:使用记忆技术。
方法:此方法基本上是递归方法的扩展,因此我们可以克服计算冗余案例的问题,从而增加了复杂性。我们可以通过简单地创建一个二维数组来解决这个问题,如果我们第一次得到它,它可以存储一个特定的状态(n,w)。现在,如果我们再次遇到相同的状态(n,w),而不是以指数复杂度进行计算,我们可以直接以固定时间返回存储在表中的结果。在此方面,此方法相对于递归方法具有优势。
下面是上述方法的python代码实现val=[60,100,120]wt=[10,20,30]W=50n=len(val)#Weinitializethematrixwith-1atfirst.t=[[-1foriinrange(W+1)]forjinrange(n+1)] defknapsack(wt,val,W,n):#baseconditions ifn==0orW==0: return0 ift[n][W]!=-1: returnt[n][W]#choicediagramcode ifwt[n-1]<=W: t[n][W]=max( val[n-1]+knapsack( wt,val,W-wt[n-1],n-1), knapsack(wt,val,W,n-1)) returnt[n][W] elifwt[n-1]>W: t[n][W]=knapsack(wt,val,W,n-1) returnt[n][W]print(knapsack(wt,val,W,n))
复杂度分析:
时间复杂度:O(N * W)。
由于避免了状态的冗余计算。
辅助空间:O(N * W)。
使用2D数组数据结构存储中间状态。
推荐阅读
趣学算法
陈小玉 著
高老头简介(高老头揭示的道理)高老头简介(高老头揭示的道理)原创爱啃书的初拾20201106193846原创作品,抄袭必究!爱啃书的初拾人是不完善的,多少有点虚伪,虚伪多的时候,傻瓜们便欢呼世道败坏!这句话出自
iphone怎么改字体(iPhone替换字体方法和注意事项)iphone怎么改字体(iPhone替换字体方法和注意事项)对于iPhone用户来说,能够对设备进行自定义设置是他们选择给系统越狱的主要原因之一。日前,锋友旧梦分享了一个在越狱iP
鸡笼山的传说(鸡笼山人定胜天的故事)鸡笼山的传说(鸡笼山人定胜天的故事)观音村前,坐落着一座山,山顶圆滑,并不高,远看去,就像一个放大了的鸡笼,上面长满了植物,一片葱绿。也因为山长得像鸡笼,那里的人都称那山为鸡笼山。
端午古诗(十首端午节古诗词)端午古诗(十首端午节古诗词)空气里弥漫着艾叶清苦的味道,烟火里氤氲着糯米粽子的清香,一年一度的端午节来了!端午节,又称端阳节龙舟节等,源由上古时代祭龙演变而来。因战国时期的楚国诗人
电脑周边(电脑周边还有这些小玩意)电脑周边(电脑周边还有这些小玩意)即便现在移动便携式电子设备大行其道,每天生活中也还是脱离不了电脑的存在,于是如何让使用电脑这一传统行为变得高效便捷有趣,便成为电脑周边设计的趋向。
红酒促销(葡萄酒怎么销售)红酒促销(葡萄酒怎么销售)针对葡萄酒销售这个话题,我进行了专门的研究,给出以下分析首先确定,是进口葡萄酒还是国产葡萄酒先说国产葡萄酒,国内市场状态是,国产葡萄酒品牌如下张裕长城王朝
情为何物(问世间情为何物,直教生死相许)情为何物(问世间情为何物,直教生死相许)死生契阔,与子成说。执子之手,与子偕老。于嗟阔兮,不我活兮。于嗟洵兮,不我信兮。诗经击鼓关雎佚名关关雎鸠,在河之洲。窈窕淑女,君子好逑。参差
星点水龟饲养指南(星点水龟怎么养?)星点水龟饲养指南(星点水龟怎么养?)如今养水族宠物日渐盛行,养虾养螺养龟养水母,这些都早已不是什么稀奇的事情。我身边就有很多朋友和我一样,选择饲养寓意长寿的龟。龟的种类很多,背甲上
微信投票群5000人大家现在对于微信投票群5000人都非常感兴趣,那么今天小编也是来给大家针对微信投票群5000人进行一个介绍吧,感兴趣的小伙伴可以接着往下看哦。由于微信投票系统方式有很多种,因此微信
目前微信投票可以买吗我们平时参加微信投票活动的时候,经常会看到某些选手的票数可以在短时间内大量的增加,自己看到别的选手票数如此快的增涨,心中羡慕不已,因此很多人就在想微信投票可以买吗?为什么别人的票数
刷票微信群多少钱一条能搞定呢最近有不少小伙伴对于刷票微信群多少钱一条这样的问题都颇为感兴趣,大家应该都知道现在的微信投票活动当中都是在依靠微信刷票提升票数的,那么想要进行微信刷票肯定就需要去找到微信刷票群来进
祝福短信中秋(群发祝福短信)祝福短信中秋(群发祝福短信)2020中秋节祝福语简短文艺古风祝词中秋快乐祝福贺词中秋节要来啦!一起和闽南网(httpwww。mnw。cn)小编来看看可以发什么祝福朋友家人同事。mu
数码知识微博生日动态怎么设置微博生日动态怎么关掉如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多小技巧的,这些技巧很多小伙伴一般都是不知道如何来实用的,就好比最近就有很多小伙伴们想要知道微博生日动态怎么设
生日蛋糕的制作方法(做生日蛋糕大全)生日蛋糕的制作方法(做生日蛋糕大全)原创天天相见厨房阿见20210530210745大家好,我是阿见,每天分享美食,分享快乐今天6个鸡蛋和一个电饭煲,给大家分享一个懒人买的蛋糕,一
赵雅淇林丹(谢杏芳当年怎么处理的)赵雅淇林丹(谢杏芳当年怎么处理的)7月4日,国家羽毛球队员林丹在个人社交平台宣布退役,一石激起千层浪。就在今天,林丹出轨门事件女主赵雅淇发文三年了,我一个女人来背锅,我认了!3年前
台湾富二代(台湾最强富二代)台湾富二代(台湾最强富二代)说起廖镇汉,在台湾可以说是如雷贯耳,台湾三侨集团董事长廖伟志的儿子,虽是富二代,但没有一点富二代的娇气,由于父亲的严厉,廖镇汉11岁就出国留学,为了存钱
什么是富二代(富二代的定义标准)什么是富二代(富二代的定义标准)原创小谢闲谈20210527114745明明是富二代,可以过着无忧无虑的生活,却偏偏要靠脸或才华吃饭。是为了让我们羡慕嫉妒恨吗?还是来娱乐圈体验生活
数码知识opporenoace怎么录制自己在手机上的操作录屏方法如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多小技巧的,这些技巧很多小伙伴一般都是不知道如何来实用的,就好比最近就有很多小伙伴们想要知道opporenoa
刘涛不断跨界,是为了扩展自我的边界文章来源科技讯11月11日深夜1点刘涛终于完成了这场长达11个小时的直播。这一天刘涛在直播间中展示了近100件产品而在整个双11期间更是一力独撑7场直播上百小时的工作量伴随着上千件
中印藏南问题(中印边界谈判放弃藏南)中印藏南问题(中印边界谈判放弃藏南)原创种花家的评论员20210527173708虽然目前印度人民深受新冠疫情的折磨,但是印度政府却仍旧在不务正业。近期,一位网友只是因为在网上说出
保护环境的警示语(环保警示语录)保护环境的警示语(环保警示语录)闽南网20210422120522今天是世界地球日,经年积累的伤害让我们的地球母亲已经不那么健康了,保护好她是我们每个人的责任,爱护环境,从我做起,
蚂蚁庄园今日问题人可以靠指纹识别身份那猫咪呢支付宝蚂蚁庄园小鸡问答6月13日支付宝的蚂蚁庄园小鸡问答是每天都会有不同的答题出现,一方面丰富我们的知识,另一方面也增加了养护小鸡的乐趣,就像今天支付宝蚂蚁庄园小鸡问答就出现了人可以靠指纹识别身份那猫咪呢支付宝蚂