[工学]背包问题.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[工学]背包问题

背包问题 By Szylover 2018-2-13 2 szylover 一个背包问题的引入 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是辰辰,你能完成这个任务吗? 2018-2-13 3 szylover 怎么做? 一个简单的想法把最贵的药给采了= =这样就可以了! 对吗? 2018-2-13 4 szylover 一个反例 2018-2-13 5 szylover 第一株要花10min而能获得10的收益 第二株要花5min但是能获得7的收益 第三株要花5min但是能获得5的收益 总共有10min时间 那么按照最大的收益只会选第一个,但是取二、三获得的价格最大 第二种做法 按照性价比贪心 2018-2-13 6 szylover 这次对了嘛? 第二个反例 2018-2-13 7 szylover 第一株要花10min而能获得10的收益 第二株要花8min但是能获得9的收益 第三株要花4min但是能获得5的收益 总共有10min时间 那么按照最大的收益只会选第三株获得最大价格! 空间有浪费 怎么得到最大值? 2018-2-13 8 szylover 暴力! AC才是硬道理! --by JYY 怎么暴力? 深度优先遍历dfs 复习一下深度优先遍历! 2018-2-13 9 szylover procedure dfs(dep:longint) begin if (到达边界) then begin 处理结果 end else begin for (每一个下一个状态)begin 进场 dfs(dep+1); 退场 end; end; end; 采药问题的深度优先解法 var ans : longint; //初始化为0 procedure dfs(dep,totPrice,totT,nowMed:longint) var i:longint; begin if (totPriceans) then ans := totPrice else begin end; end; 2018-2-13 10 szylover for i:=nowMed+1 to n do dfs(dep+1,totPrice+p[i],totT+T[i],i); 这个算法的复杂度? 2018-2-13 11 szylover O(2n) 1 2 3 4 …… n 2 4 8 16 2n 当n到达60的时候有1,152,921,504,606,846,976 但是计算机一秒只运行亿次运算左右这样计算到60就要1,152,921,504,6s也就是8750年= = 太慢 2018-2-13 12 szylover 一种正规的解法 首先来分析一下为什么为造成这么慢的原因先来看一下dfs中的那段代码 2018-2-13 13 szylover for i:=nowMed+1 to n do dfs(dep+1,totPrice+p[i],totW+p[i],i); 我们来做一个假设= =||基于大家是没有办法通过研究发现这一个问题的所以我把问题提了出来 如果我在第一层发现了前3个物品通过某种组合构成时间20 但是通过回溯又发现前5种物品通过某种组合也可以构成时间20= =只是价格不同那么我们还有必要在这样递归下去嘛? 其次在递归过程中会多次用到前3个物品的状态= =是不是依然要递归? 没有 那怎么办? 首先根据刚刚分析就是如果某个状态被计算过就不必要计算了其次如果某个状态能够通过前面的计算出来也不要计算了。 也就是说我们递归出每个重量的最优价值! 所以我们可以用一个opt[i][j]数组来表示前i个草药总时间j所能获得的最大价值那么在递归的时候如果出现某个opt[][]被计算过那么久直接返回否则继续计算。 2018-2-13 14 szylover 问题转换了 现在问题转换成了怎么计算出opt数组了 那么我们的dfs也要稍作修改了我们用两个参数 int dfs(i,totW)用来计算前i个物品的总重量totW的最大价值 2018-2-13 15 szylover 第一如果某个值被计算了就不要计算了 第二 opt[i][j] = min{opt[i-1][j] , opt[i-1][j-t[i]]+p[i] } 去往未来 白洞白色的明天等着我们 一个新的

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档