解题报告其它.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

问题重述:

给出n种邮票,每种邮票有自己的面值(面值可能重复)

指定m种“总面值”,对每种“总面值”,求解满足如下条件的组合以达到该“总面值”

所用邮票在n种中可以重复选取

所用邮票张数〈=4

尽量多的适应那个不同总类的邮票Max(StampTypes)

若有多种方案满足(3),则选取张数最小的一种方案Min(StampNum)

若有多种方案满足(3)(4),则选取“最大面额”最高的一种方案。Max(HeightestValue)

若有多种方案满足(3)(4)(5)则输出“tie”

题目分析:

算法定位:

从题目的条件可知,此题必须遍求所有方案以求解,因此采用搜索的方法是非常合理的,因为题目带由一定的递推性,也可以尝试动态规划的方法.

问题优化与简化

对于搜索型题目,关键的优化就是减少重复计算,本题可由3方面的简化,避免重复性计算.

对于面额相等的邮票,可以限制在1~5张,多余的可以不处理,例如这样的输入:

111111110 8个1

40

可以简化成为:

111110 5个1

40

他们的解是相同的

搜索求解时约定,后一张邮票面额=前面张邮票的面额,即如下的6种情况:

123 231 312 132 321 213

只需搜索判断一种,即123的情况

对于给定的n种邮票,遍历4张邮票的所有可达“总面额”的解,当m种指定面额给出,只需插标输出即可,不需要重复m次类似的搜索。(因为m次的搜索中,很多是重复计算的)

(3)算法介绍

(1)搜索方法一:(baseon史诗’sprogram)

主要思路:

4重循环,枚举所有可能,依据题目条件保留最优解。

For(i=1;i=total_stamps;i++)

For(j=i;j=total_stamps;j++)

For(k=j;k=total_stamps;k++)

For(l=k;l=total_stamps;l++)

{

更新最优解

}

优化:

使用优化方案(1)(2),修改后可以加上优化方案(3)

评价:

编程复杂度低,代码少,运行时空效率高,比赛时候推荐使用

但是扩展性受限制,若题目给的是任一k张而不是4,则必须大量修改代码

(2)搜索方法二:(baseonhawking’sprogram)

主要思路:

递归深度搜索,遍历所有k张邮票的可达面额的解,保留每种面额的最优

解,查表输出指定面额的解,并给定k=4,即为题目要求的情况。

VoidSolve(intdeep)

{

更新当前方案所达面值的最优解

if(deep4)return;

for(ints=now[deep-1];s=total_stamp;s++)

{

now[deep]=s;

solve(deep+1);

}

}

优化:

使用优化方案(1)(2)(3)进行截枝

评价:

深度搜索的经典模板程序,推荐学习,几乎所有的搜索都可以套用的模板

编程复杂度中,运行时空效率高,通用性强一些,但代码可能稍为多一些

(3)动态规划:(baseonmyprogram)

主要思路:

定义:intanstype[k][i][j]表示:

用前k种邮票,选i张,达到面额为j,最多用多少种不同的类型邮票。

定义:booltied[k][i][j]:

k,i,j定义如上,tied表示anstype[k][i][j]的最优值是否有多种方案.即同时满足题目的条件(3)(4)时是否多种

定义:boolanstied[k][i][j]:

由于tied限制不够强,必须多一个anstied表示同时满足条件(3)(4)(5)是否有多种方案

递推关系:

(1)

anstype[k][i][j]=Max{anstype[k-1][i-w][j-w*value[k]]+1}1=w=4,i-w0,j-w*value[k]=0

(2)

在anstype的更新最大值的同时,可以判断,若某个w使得

anstype[k][i][j]==anstype[k-1][i-w][j-w*value[k]]+1则

tied[k][i][j]=ture;

anstype[k][i][j]anstype[k-1][i-w][j-w*value[k]]+1则

tied[k][i][j]=false

(3)

至于anstied可以这样求得:

anstype[k][i][j]anstype[k-1][i-w][

文档评论(0)

godcoovAuxsv + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档