动态规划的具体应用例题.docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划的具体应用例题 3.1 最长不降子序列 (1)问题描述 设有由n个不相同的整数组成的数列,记为: a(1)、a(2)、……、a(n)且a(i)<>a(j)? (i<>j) 例如3,18,7,14,10,12,23,41,16,24。 若存在i1<i2<i3< … < ie 且有a(i1)<a(i2)< … <a(ie)则称为长度为e的不下降序列。如上例中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,24长度为6的不下降序列。程序要求,当原数列给出之后,求出最长的不下降序列。 (2)算法分析 根据动态规划的原理,由后往前进行搜索。 1· 对a(n)来说,由于它是最后一个数,所以当从a(n)开始查找时,只存在长度为1的不下降序列; 2· 若从a(n-1)开始查找,则存在下面的两种可能性: ①若a(n-1)<a(n)则存在长度为2的不下降序列a(n-1),a(n)。 ②若a(n-1)>a(n)则存在长度为1的不下降序列a(n-1)或a(n)。 3· 一般若从a(i)开始,此时最长不下降序列应该按下列方法求出: 在a(i+1),a(i+2),…,a(n)中,找出一个比a(i)大的且最长的不下降序列,作为它的后继。 4.用数组b(i),c(i)分别记录点i到n的最长的不降子序列的长度和点i后继接点的编号 (3) 程序如下:(逆推法) program li1; const maxn=100; var a,b,c:array[1..maxn] of integer; ??? fname:string; ??? f:text; ??? n,i,j,max,p:integer; begin ?readln(fname); ?assign(f,fname); ?reset(f); ?readln(f,n);+ ?for i:=1 to n do ? begin ? read(f,a[i]); ? b[n]:=1; ? c[n]:=0; ? end; ?for i:= n-1 downto 1 do ? begin ?? max:=0;p:=0; ?? for j:=i+1 to n do ??? if (a[i]<a[j]) and (b[j]>max) then? begin max:=b[j];p:=j end; ?? if p<>0 then begin b[i]:=b[p]+1;c[i]:=p end ? end; ?max:=0;p:=0; ?for i:=1 to n do ? if b[i]>max then begin max:=b[i];p:=i end; ?writeln('maxlong=',max); ?write('result is:'); ?while p<>0 do ? begin write(a[p]:5);p:=c[p] end; end. 3.2 背包问题 背包问题有三种 1.部分背包问题  一个旅行者有一个最多能用m公斤的背包,现在有n种物品,它们的总重量分别是W1,W2,...,Wn,它们的总价值分别为C1,C2,...,Cn.求旅行者能获得最大总价值。 解决问题的方法是贪心算法:将C1/W1,C2/W2,...Cn/Wn,从大到小排序,不停地选择价值与重量比最大的放人背包直到放满为止. 2.0/1背包 一个旅行者有一个最多能用m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。 ?<1>分析说明: 显然这个题可用深度优先方法对每件物品进行枚举(选或不选用0,1控制). 程序简单,但是当n的值很大的时候不能满足时间要求,时间复杂度为O(2n)。按递归的思想我们可以把问题分解为子问题,使用递归函数 设 f(i,x)表示前i件物品,总重量不超过x的最优价值 则 f(i,x)=max(f(i-1,x-W[i])+C[i],f(i-1,x)) f(n,m)即为最优解,边界条件为f(0,x)=0?,f(i,0)=0; 动态规划方法(顺推法)程序如下: 程序如下: program knapsack02; ?const maxm=200;maxn=30; ?type ar=array[1..maxn] of integer; ?var m,n,j,i:integer; ?c,w:ar; ?f:array[0..maxn,0..maxm] of integer; ?function max(x,y:integer):integer; ?begin ? if x>y then max:=x else max:=y; ?end; ?begin ?

文档评论(0)

today-is-pqsczlx + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档