第25讲动态规划.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文档。上传文档
查看更多
回顾: 数字三角形 机器人捡垃圾 最大连续子序列和 最长递增子序列 背包问题。 主程序: fillchar(f,sizeof(f),0); for i:=1 to n do   for j:=1 to m do begin f[i,j]:=f[i-1,j]; //不选择第i件物品 if (j=w[i]) and (f[i,j]f[i-1,j-w[i]]+v[i]) //选择第i件物品} then f[i,j]:=f[i-1,j-w[i]]+v[i]; end; writeln(f[n,m]); end. 结合题目看方程:顺推和倒推 1、机器分配 【问题描述】 总公司拥有高效生产设备M台,准备分给下属的N个公司。各分公司 若获得这些设备,可以为国家提供一定的盈利。 问: 如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。 其中M=150,N=100。分配原则:每个公司有权获得任意数目的设备 ,但总台数不得超过总设备数M。 【输入】 第一行两个数,第一个数是分公司数N,第二个数是设备台数M。 接下来是一个N*M的矩阵A,A[i,j]是第i个公司分配j台机器所能获 得的盈利。0=A[i,j]=1000 【输出】 最大盈利值。 【样例输入】 3 4 10 15 26 30 20 32 38 43 12 20 27 35 【样例输出】 54 f[i,j]:前i个(1..i)公司分配j台机器获得的最大盈利。 求如下的数组: f[1,1],f[1,2],……,f[1,m] f[2,1],f[2,2],……,f[2,m] …… f[n,1],f[n,2],……,f[n,m] 目标: f[n,m] for i:=1 to m do f[1,i]:=a[1,i]; for i:=2 to n do for j:=1 to m do for k:=0 to j do f[i,j]:=max(f[i,j],f[i-1,j-k]+a[i,k]); for i:=1 to n do for j:=1 to m do for k:=0 to j do f[i,j]:=max(f[i,j],f[i-1,j-k]+a[i,k]); 写法改进: fillchar(f,sizeof(f),0); //至少保证第0行全部为0 for i:=1 to n do f[i,i-1]:=-5001; //对角线下斜线为无穷小 for i:=1 to n do for j:=i to m-(n-i) do f[i,j]:=max(f[i,j-1],f[i-1,j-1]+a[i,j]); 实现: fillchar(f,sizeof(f),0); for i:=1 to n do for j:=i to m-(n-i) do begin f[i,j]:=min; for k:=i-1 to j-1 do if f[i-1,k]f[i,j] then f[i,j]:=f[i-1,k]; inc(f[i,j],a[i,j]); end; ans:=min; for i:=n to m do if f[n,i]ans then ans:=f[n,i]; 输出方案: fillchar(f,sizeof(f),0); fillchar(path,sizeof(path),0); for i:=1 to n do for j:=i to m-(n-i) do begin f[i,j]:=min; for k:=i-1 to j-1 do if f[i-1,k]f[i,j] then begin f[i,j]:=f[i-1,k]; path[i,j]:=k; end; inc(f[i,j],a[i,j]); end; ans:=min; for i:=n to m do if f[n,i]ans then begin ans:=f[n,i]; la

文档评论(0)

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

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

1亿VIP精品文档

相关文档