6.1一般方法与求解步骤.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文档。上传文档
查看更多
Visual FoxPro 3. 最优性原理 最优性原理:“作为整个过程的最优策略具有这样的性质,无论过去的状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略”。 也就是说,最优决策序列中的任何子序列都是最优的。 最优性原理体现为问题的最优子结构特性。当一个问题的最优解中包含了子问题的最优解时,则称该问题具有最优子结构特性。 最优子结构特性是动态规划求解问题的必要条件。 例如,求得在数字串847313926中插入5个乘号,使乘积最大的最优解为: 8*4*731*3*92*6 该最优解包含了在84731中插入2个乘号使乘积最大为8*4*731;在7313中插入1个乘号使乘积最大为731*3;在3926中插入2个乘号使乘积最大为3*92*6等子问题的最优解,这就是最优子结构特性。 最优性原理是动态规划的基础。任何一个问题,如果失去了这个最优性原理的支持,就不可能用动态规划设计求解。 (1) 把所求最优化问题分成若干个阶段,找出最优解的性质,并刻划其结构特性。 (2) 将问题发展到各个阶段时所处不同的状态表示出来,确定各个阶段状态之间的递推关系,并确定初始(边界)条件。 (3) 应用递推求解最优值。 (4) 根据计算最优值时所得到的信息,构造最优解。 构造最优解就是具体求出最优决策序列。通常在计算最优值时,根据问题具体实际记录更多的信息,根据所记录的信息构造出问题的最优解。 (2) 动态规划设计 (3) 递推计算最优值 for(j=0;jw[n];j++) m[n][j]=0; for(j=w[n];j=c1;j++) m[n][j]=w[n]; for(i=n-1;i=1;i--) /* 逆推计算m(i,j) */ for(j=0;j=c1;j++) if(j=w[i] m[i+1][j]m[i+1][j-w[i]]+w[i]) m[i][j]=m[i+1][j-w[i]]+w[i]; else m[i][j]=m[i+1][j]; printf(“%d”,m[1][c1]); (3) 构造最优解 构造最优解即给出所得最优值时的装载方案。 if(m[i][cw]m[i+1][cw]) (其中cw为当前的装载量,i=1,2,,n-1) 装载w[i]; else 不装载w[i]; if(所载集装箱重量≠m(1,c1)) 装载w[n]. 6.3 插入乘号问题 【例6.3】 在一个由n个数字组成的数字串中插入r个乘号(1≤rn10),将它分成r+1个整数,找出一种乘号的插入方法,使得这r+1个整数的乘积最大。 例如,对给定的整数847313926,如何插入r=5个乘号,使其乘积最大? 如何插入r=4个乘号,使其乘积最大? (1) 算法设计 设f(i,k)表示在前i位数中插入k个乘号所得乘积的最大值,a(i,j)表示从第i个数字到第j个数字所组成的j-i+1(i≤j)位整数值。 一般地,为了求取f(i,k),考察数字串的前i个数字,设前j(k≤ji)个数字中已插入k-1个乘号的基础上,在第j个数字后插入第k个乘号,显然此时的最大乘积为f(j,k-1)*a(j+1,i)。于是可以得递推关系式: f(i,k)=max(f(j,k-1)*a(j+1,i)) (k≤ji) 前j个数字没有插入乘号时的值显然为前j个数字组成的整数,因而得边界值为: f(j,0)=a(1,j) (1=j=i) (2) 递推计算最优值 for(d=0,j=1;j=n;j++) {d=d*10+b[j-1]-48; /* 把b数组的一个字符转化为数值 */ a[1][j]=d; f[j][0]=a[1][j]; /* f(j,0)赋初始值 */ } for(k=1;k=r;k++) for(i=k+1;i=n;i++) {for(amax=0,j=k;ji;j++) {for(d=0,u=j+1;u=i;u++) d=d*10+b[u-1]-48; a[j+1][i]=d; if(amaxf[j][k-1]*a[j+1][i]) /* 求f(j,k-1)*a(j+1,i)最大值 */ amax=f[j][k-1]*a[j+1][i]; } f[i][k]=amax; /* 赋值给f(i,k) */ } printf

文档评论(0)

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

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

1亿VIP精品文档

相关文档