正整数拆分.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文档。上传文档
查看更多
正整数拆分

HYPERLINK file:///D:\\wyf\\docs\\专题模式.mht 回专题模式 HYPERLINK file:///D:\\wyf\\docs\\学习阶段模式.mht 回学习阶段模式【题目名称、来源】 正整数拆分(经典问题)【问题描述】输入自然数n,然后将n拆分为由若干个数相加的形式,参与加法运算的数可以重复。输入:n输出:所有拆分方案总的拆分数例如:输入:7输出:7=1+67=1+1+57=1+1+1+47=1+1+1+1+37=1+1+1+1+1+27=1+1+1+1+1+1+17=1+1+1+1+2+27=1+1+2+37=1+2+47=1+2+2+27=1+3+37=2+57=2+2+37=3+414【所属专题】递归、回溯【适合学习阶段】第一阶段、第二阶段【解题思路】 问题分析:很明显这是一道关于数的组合的问题,我们考虑要形成和为n的一些书的组合要满足以下限制:这一组数的和为n每一组数的个数不固定为了避免重复,我们可以让组合中的后一个数必须不小于前一个数。例如n=3时1+2,2+1其实是同一种方案。可以将待拆分的数表示成状态,拆去的数值当作规则,拆分的时候最小的数应不小于前一个数,设拆分过程为:Procedure chaifen(m,start,k);{m为待拆分的数,start为上一步拆掉的数,k为拆到第几步了}这样拆分的过程可以用下图表示: 存储结构:Vara:array [1..100] of integer;{记录递归过程中待拆分数m}b:array[1..100] of integer;{记录拆去的数}提高:如果本问题只要求出拆分总数则可以使用动态规划求解正整数n的拆分方案f(n)的递推式为:f(n)=f(n,1)+f(n,2)+…+f(n,n-1)+f(n,n)【测试数据】【源程序】program chaifen;var a,b:array[1..100] of integer; {a:待拆分的数;b:被拆掉的数} n,count:integer; procedure chai(m,start,k:integer); {m:待拆分的数,start:上一颗被拆掉的数,k拆到第几个了} var i,j:integer; begin for i:=start to (m div 2) do begin a[k]:=m-i;b[k]:=i;{记录拆分方案} {打印} write(n,=); for j:=1 to k do write(b[j],+); writeln(a[k]); count:=count+1; chai(a[k],i,k+1); end; end;begin assign(input,chaifen.in); reset(input); readln(n); close(input); assign(output,chaifen.out); rewrite(output); count:=0; chai(n,1,1); writeln(count); close(output);end.

文档评论(0)

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

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

1亿VIP精品文档

相关文档