连续邮资问题.docVIP

  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文档。上传文档
查看更多
实 验 报 告 课程: 算法分析与设计 系科: 计算机应用技术 班级: 年度: 2010-2011 学期: 上 计算机科学与工程学院 连续邮资问题 一、 问题描述 假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m的值,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。例如,当n=5和m=4时,面值为{1,3,11,15,32}的5种邮票可以贴出的最大连续邮资区间是1到70. 二、 算法设计 基本思想: 对于连续邮资问题,我们用n元组x[1:n]表示n种不同的邮票面值,并约定它们从小到大排列。x[1]=1是唯一的选择,此时的最大连续邮资区间是[1:m]。接下来,x[2]的可取值范围是[2:m+1]。在一般情况下,已选定x[1:i-1],此时的最大连续邮资区间是[1:r],则这时,可以用一棵树来表示其解空间。该解空间树种各结点的度随x的不同取值而变化。 在下面的回溯法描述中,递归函数Backtrack实现对整个解空间的回溯搜索,递归函数Backtrack是类stamps的成员。类stamps的其它成员记录解空间中结点的信息,以减少传给函数Backtrack的参数。maxvalue记录当前已找到的最大连续邮资区间,bestx是相应的当前最优解。数组y用于记录当前已选定的邮票面值x[1:i]能贴出各种邮资所需的最少邮票张数,换句话说,y[k]是用不超过m张面值为x[1:i]的邮票贴出邮资k所需的最少邮票张数。 在函数Backtrack中,当igt;n时,表示算法已搜索至一个叶结点,得到一个新的邮票面值设计方案x[1:n]。如果该方案能贴出的最大连续邮资区间大于当前已找到的最大连续邮资区间maxvalue,则更新当前最优值maxvalue和相应的最优解bestx。 当ilt;=n时,当前扩展结点Z是解空间中的一个内部结点。在该结点处x[1:i-1]能贴出的最大连续邮资区间为r-1。因此,在结点Z处,x[i]的可取值范围是 [x[i-1]+1:r],从而,结点Z有r-x[i-1]个儿子结点。算法对当前扩展结点Z的每一 - 1 - 个儿子结点,以深度优先的方式递归的对相应的子树进行搜索。 三、 算法实现 } int MaxStamp(int n,int m,int bestx[]){ } int *z=new int[maxl+1]; for(int k=1;klt;=maxl;k++) z[k]=y[k]; } return; bestx[j]=x[j]; } maxvalue=r-1; for(int if(y[j]+klt;y[j+x[i-1]*k]) y[j+x[i-1]*k]=y[j]+k; r++; if(r-1gt;maxvalue){ while(y[r]lt;maxint) if(igt;n){ Stamp X; int maxint=32767; int maxl=1500; X.n=n; X.m=m; X.maxvalue=0; X.maxint=maxint; X.maxl=maxl; X.bestx=bestx; X.x=new int [n+1]; X.y=new int [maxl+1]; for(int i=0;ilt;=n;i++) X.x[i]=0; X.y[i]=maxint; for(i=1;ilt;=maxl;i++) X.x[1]=1; X.y[0]=0; X.Backtrack(2,1); coutlt;lt;quot;当前最优解:quot;; for(i=1;ilt;=n;i++) coutlt;lt;bestx[i]lt;lt;quot; quot;; coutlt;lt;endl; delete[] X.x; delete [] X.y; return X.maxvalue; for(j=x[i-1]+1;jlt;=r;j++){ } x[i]=j; Backtrack(i+1,r); for(int y[k]=z[k]; ********************************************************************************************class Stamp { friend int MaxStamp(int ,int ,int []); private: }; void Stamp::Backtrack(int i,int r) { for(int j=0;jlt;=x[i-2

文档评论(0)

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

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

1亿VIP精品文档

相关文档