计算拆分方案.docx

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

【题6】计算拆分方案

任何大于1的自然数n都可以拆分成若干个小于n的自然数之和。输入n,计算和输出n的不同拆分方案。

题解

我们用数组a[1..100]存储已完成的拆分,所有自然数按照递增顺序排列:n=a[1]+a[2]+…a[k](a[1]

≤a[2]≤…≤a[k])。这个多项式能否延长,关键看a[k]能否继续拆分成m和a[k]-m。按照递增要求,当

a[k-1]≤m≤?a[k]?

时,多项式可延长至 n=a[1]+a[2]+…a[k]’+a[k+1]’(a[1]≤a[2]≤…≤a[k]’≤

2? ?

2

? ?

a[k+1]’(a[k]’=m,a[k+1]’=a[k]-m)。设

⑴状态kx

kx为待拆分的元素序号,即多项式中最后一个自然数的序号。由于需要输出每一个拆分方案,因此当前的拆分方案n=a[1]+a[2]+…a[kx]不存在什么边界条件。

⑵搜索范围

设a[kx]拆分成m和a[kx]-m。我们将m作为算符。按照递增要求,a[kx-1]≤m≤?a[kx]?

。只要m在这

2? ?

2

? ?

个范围内,a[kx]即可拆分成a[kx]’=m和a[kx+1]=a[kx]-m,该搜索范围隐含了约束条件。我们用递归程序sum(kx)描述拆分方案的计算过程:

proceduresum(kx:integer); {从a[kx]出发,递归计算拆分方案}var

k,l,m:integer;begin

s←s+1;

{累计拆分方案数}

write(’sumN0’,s:3,’:’,n,’=’);

{输出当前的拆分方案}

fork←1tokx-1dowrite(a[k],’+’);

writeln(a[kx]);

k←kx;l←a[k];

form←a[k-1]toldiv2do

{

拆分a[kx]=a[k]’+a[k+1]’}

{枚举a[k]’的所有可能值}

begin

a[k]←m;a[k+1]←l-m;

sum(k+1); {递归拆分a[kx+1]}

end;{for}end;{sum}

调用sum过程的前提是a[1]和a[2]已知。我们按照递增要求,枚举a[1]和a[2]的所有可能值:1≤

a[1]≤i,a[2]=n-a[1](1≤i≤?n?

?2?

),并分别调用sum(2),便可计算出所有拆分方案:

? ?

ifn=2then

fori←1tondiv2do {枚举a[1]和a[2]的所有可能情况}begin

a[1]←i;a[2]←n-a[1];

sum(2); {从当前的a[2]出发进行拆分}

end;{for}

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

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

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档