- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DP(动态规划背包小讲)
DP动态规划之背包
先上题目吧:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
基本思路:
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]};
对于第i个物品,可以选择放进背包,也可以选择不放进背包。所以选择最大的情况,用max判断那种状况是最大值。
如果不放,那当前f[i][v]=f[i-1][v];
如果放,那当前f[i][v]=f[i-1][v-c[i]]+w[i],将背包容量减去第i个物品的重量,然后再加上它的价值。
举个例子吧:假设有 一共有4个物品,总容量6。
weight容量 value价值
第1个物品 1 4
第2个物品 2 6
第3个物品 3 12
第4个物品 2 7
关键代码:
for(i=1;i=n;i++) //n=4 (物品数目)
for(v=m;v=weight[i];v--) //m=6(背包容量)
f[v] = Max(f[v],f[v-weight[i]]+value[i]);
依次考虑将这4个物品放入背包:
第1个物品 f[6]=4 f[5]=4 f[4]=4 f[3]=4 f[2]=4 f[1]=4
第2个物品 f[6]=10 f[5]=10 f[4]=10 f[3]=10 f[2]=6
第3个物品 f[6]=22 f[5]=18 f[4]=16=f[3]=12
第4个物品 f[6]=23 f[5]=19 f[4]=16 f[3]=12 f[2]=7
但为何是这样呢?
f[v] 代表放第i物品时,容量为v的背包能放的物品最大价值。当放第1个物品时,因为第1 个物品的重量为1,所以容量为1到6的背包都可以放这个物品,即 f[v]=4;放第2个物品时,因为第2 个物品的重量为2,所以容量为3到6的背包都可以将第1、2个物品容纳,f[v]=10(v对于3小于6);同理,一直这样循环下去,f[6]的值就是所求的值。
难理解的地方:
关于背包容量的判断 for(v=m;v=weight[i];v--)为什么满足这个条件的背包马努题意呢?按说这条语句只能说明当前背包能容纳第i个物品,但是仔细一样难怪会是这样。
首先,是从最大背包开始判断的;其次,在判断如何放是最大的, Max(f[v],f[v-weight[i]]+value[i]),此时回到了判断放不放第i个物品的问题,就是判断哪种情况的值更大。不放好说,如果放的话就减去第i个物品的重量,然后去找剩下的容量能够容纳的最大值。
PS:什么容量,重量,价值,都可以换成很多东西。就看如何将问题转化为背包为题了。
( Written By Zys)
文档评论(0)