梦幻西游挖矿赚钱(挖矿赚钱) 剖腹产的好处(剖腹产的好处有哪些) 如图已知ab为圆o的直径弦cd⊥ab垂足为h(如图 已知AB是圆O的直径 弦CD垂直AB 垂足为H) 深圳上下沙租房攻略(深圳下沙哪里租房便宜) 被2345和hao123主页篡改修复方法 2015(2345是怎样篡改主页的以及如何彻底删除) nba历史得分榜百度一下(nba历史得分榜百度百科) 如何防雾霾 什么口罩防雾霾效果好(什么口罩可以防霾) 制作手工的材料有哪些(制作手工的材料有哪些简单) 天使等级 北京商标注册流程图(北京商标注册流程图解析) Galaxy S4 发布 全面解析新旗舰 图(galaxy s4 上市时间) 土大黄根主要治什么病(土大黄与大黄的区别) vivo手机怎么定位(vivo手机怎么定位查找) dnf更新失败怎么办 安装文件写入失败怎么办(为什么dnf更新写入失败) 隔玻璃晒太阳能起作用(隔着玻璃晒太阳能补钙) steam国服怎么玩apex(steam国服怎么玩最终幻想14) 纳雍县是哪个市 蜂蜜可以放冰箱吗(蜂蜜可以放冰箱吗可以放多久) 电脑怎么连热点(联想电脑怎么连热点) 石器时代宠物攻略(石器时代宠物大全) 经济管理出版社地址(经济管理出版社) 芒果tv怎么看湖南卫视(芒果tv怎么看湖南卫视回放) iPhone13如何在微店购物?(iphone13直营店可以直接买到吗) 淘宝海外版叫什么(淘宝海外版) 幽门螺杆菌抗体(幽门螺杆菌抗体偏高是怎么回事) iOS7.1.1固件下载(ios7.0.4固件下载) 纸的来源视频(纸的来源) QQ农场怎么出售种子精华(QQ农场种子精华) 玉兔出宫怎么画(玉兔出宫怎么画简单) 光电信息科学与工程是干什么工作(光电信息科学与工程是干什么的) 卡通签名头像怎么制作(卡通签名头像怎么制作软件) 比赛规则有哪些(比赛规则) 黑夹子的小妙用(黑夹子的小妙用有哪些) dear sir or madam要大写吗(dear sir or madam) 保卫萝卜——天际2攻略(保卫萝卜天际2关攻略) XP输入法状态条不见了怎么办(xp输入法不显示) 语言能力描述范文100字(语言能力描述) 电脑显示器总是黑屏怎么办(电脑显示器总是黑屏怎么办恢复) 银屑病怎么治疗最好呢(治疗银屑病有什么好办法) 东非高原动物大迁徙(东非高原) 茶叶怎样利用微波进行了快速杀青处理(茶叶怎样利用微波进行了快速杀青处理工艺) Java:将数组排序并使用二分法判断数组元素(java对二维数组排序) 密不可分的英语短语(密不可分的英语) 购买笔记本电脑时要注意什么(购买笔记本电脑时要注意什么事项) 工行如何设置信用卡分期付款 手续费计算(工行如何设置信用卡分期付款,手续费计算方式) 国粹苑物业电话(国粹苑) 冬季安全手抄报(冬季安全手抄报图片简单又漂亮) 研究表明大脑的不同区域的激活取决于音乐和语言的结构复杂性 FDA 批准首次血液检测来预测孕妇先兆子痫 盆底疾病的早期诊断对健康至关重要
您的位置:首页 >要闻 >

01背包问题可以用哪些方法(0 1背包问题)

导读 关于01背包问题可以用哪些方法,0 1背包问题这个问题很多朋友还不知道,今天小六来为大家解答以上的问题,现在让我们一起来看看吧!1、"P0

关于01背包问题可以用哪些方法,0 1背包问题这个问题很多朋友还不知道,今天小六来为大家解答以上的问题,现在让我们一起来看看吧!

1、"P01: 01背包问题题目有N件物品和1个容量为V的背包。

2、第i件物品的费用是c[i],价值是w[i]。

3、求解将哪些物品装入背包可使价值总和最大。

4、基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选取放或不放。

5、用子问题定义状态:即f[i][v]表示前i件物品恰放入1个容量为v的背包可以获得的最大价值。

6、则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}这个方程非常重要,基本上全部跟背包相关的问题的方程都是由它衍生出来的。

7、因此有必要将它清楚解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为1个只牵扯前i-1件物品的问题。

8、假如不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];假如放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。

9、优化空间复杂度以上方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。

10、先考虑上边讲的基本思路怎么实现,肯定是有1个主循环i=1..N,每回算出来二维数组f[i][0..V]的全部值。

11、那么,假如只用1个数组f[0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]2个子问题递推而来,能否保证在推f[i][v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1][v-c[i]]的值呢?事实上,这要求在每回主循环中我们以v=V..0的顺序推f[v],这样才可以保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值。

12、伪代码如下:for i=1..N for v=V..0 f[v]=max{f[v],f[v-c[i]]+w[i]};其中的f[v]=max{f[v],f[v-c[i]]}一句恰就相当于我们的转移方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},由于目前的f[v-c[i]]就相当于原来的f[i-1][v-c[i]]。

13、假如将v的循环顺序从上边的逆序改成顺序的话,那么则成了f[i][v]由f[i][v-c[i]]推知,与本题意不符,但它却是另1个重要的背包问题P02最简捷的处理方案,故学习只用一维数组解01背包问题是十分必要的。

14、事实上,用一维数组解01背包的程序在后面会被多次用到,因此这里抽象出1个处理一件01背包中的物品过程,以后的代码中直接调出使用不加说明。

15、过程ZeroOnePack,表示处理一件01背包中的物品,2个参数cost、weight分别表明这件物品的费用和价值。

16、procedure ZeroOnePack(cost,weight) for v=V..cost f[v]=max{f[v],f[v-cost]+weight}注意这个过程里的处理与前面给出的伪代码有所不一样。

17、前面的示例程序写成v=V..0是为了在程序中体现每一个状态都按照方程求解了,避免不必要的思维复杂度。

18、而这里既然已经抽象成看作黑箱的过程了,就可以加入优化。

19、费用为cost的物品不会影响状态f[0..cost-1],这是显然的。

20、有了这个过程以后,01背包问题的伪代码就可以这样写:for i=1..N ZeroOnePack(c[i],w[i]);初始化的细节问题我们看见的求最优解的背包问题题目中,事实上有两种不太相同的问法。

21、有的题目要求“恰好装满背包”时的最优解,有的题目则并木有要求必须把背包装满。

22、一种区别这两种问法的实现方法是在初始化的时候有所不一样。

23、假如是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。

24、假如并木有要求必须把背包装满,而是只期望价钱尽量大,初始化时应当将f[0..V]全部设为0。

25、为啥呢?可以这样理解:初始化的f数组事实上就是在木有任何物品可以放入背包时的合法状态。

26、假如要求背包恰好装满,那么此时仅有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均木有合法的解,属于未定义的状态,它们的值就都应当是-∞了。

27、假如背包并非必须被装满,那么任何容量的背包都有1个合法解“啥都不装”,这个解的价值为0,因此初始时状态的值也就全部为0了。

28、这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始化进行讲解。

29、小结01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。

30、故一定要仔细体会上边基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。

31、"。

本文分享完毕,希望对大家有所帮助。

标签:

免责声明:本文由用户上传,如有侵权请联系删除!