- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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] }
去往未来
白洞白色的明天等着我们
一个新的
您可能关注的文档
最近下载
- 重庆大学版信息科技四年级上册全册教案教学设计.doc VIP
- 大班课件《有趣的盐》.pptx VIP
- DB51T 3239-2024 危险化学品安全生产数据交换规范.pdf VIP
- 中小学音体美器材配备重点标准.doc VIP
- 2024年全国考点PET口语真题汇总(1-12月).pdf VIP
- 医疗器械不良事件培训试题及答案.docx VIP
- 马工程《马克思主义政治经济学概论》(第2版)配套题库【考研真题精选+章节题库】.pdf VIP
- 话题幼儿园语言教育活动设计.ppt
- JBT 5943-2018 工程机械 焊接件通用技术条件.pdf VIP
- 创新国有企业党建工作提升员工幸福感-来源:现代企业文化·下旬刊(第2020003期)-中国工人出版社.pdf VIP
文档评论(0)