P最大乘积【DOC精选】.doc

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

最大乘积 题目解析: 贪心策略! 一个大的数,是分解好,还是不分解好? 设这个数为m=a+b,很自然a*ba+b(a,b均1),因为乘法乘以1,其结果不变。也就是说任何一个数,只要你愿意分解,你就可以得到更大的结局。 很自然想到,分解的越多越好! 交换论证法来证明: 给定一个最优解(分解成多个数据),如果其中某个数可以分解的话,我们将得到一个新的解,其结果比优解还要优! 分解成的因子越小(1)越好,乘积越大 要求分解出来的因子均不可相同。 本题贪心策略: 分解的因子,从2开始,尽可能地要求因子小,同时又不能相同! 因此从2开始,再逐步递增! 结果可能的情形:2*3*4*…..*K*m 最后得到的一个数m,(m=k) 处理方案:m将和某个数相同,不符合题意,这样,我们只能调整2…k中的一些数,要求每个数都尽可能小,我们想到从末端开始,逐步微调整,循环进行! 初看此题,很容易想到用回溯法进行搜索,但是这里的n范围比较大,最多到10000,如果盲目搜索,运行时间比较长,效率很低,对于部分数据可能得到结果,对于大部分数据会超时或栈溢出。 先来看看几个n比较小的例子,看能否从中找出规律: n 分解方案 最大的乘积 5 2 3 6 6 2 4 8 7 3 4 12 8 3 5 15 9 2 3 4 24 10 2 3 5 30 可以发现,将n分解成a1, a2, a3, a4,…, am这m个自然数,该序列为从2开始的一串由小到大的自然数,如果a1为1,则对乘积没有影响,而且使n减少,没有实际意义,只有特殊情况如n为3、4时才可能用上。 设h=5,可以证明当将h拆分为两个不相同的部分并且两部分都大于1时两部分的乘积大于h。证明如下: 将h分为两部分:a,h-a其中2=ah/2,两部分的乘积为a*(h-a)。 a*(h-a)-h=h*a-a*a-h=h*(a-1)-a*a 因为h2*a,所以a*(h-a)-h2*a*(a-1)-a*a=a*a-2*a=a*(a-2) 又因为a=2,所以a*(a-2)=0,所以a*(h-a)-hO即a*(h-a)h。 从上面的证明可以看出,对于指定的正整数,如果其大于等于5,将它拆分为不同的部分后乘积变大,对于中间结果也是如此。因此可以将指定的n,依次拆成a1+a2+a3+a4+…+am,乘积最大。 现在的问题是如何拆分才能保证n=a1+a2+a3+a4+…+am呢? 可以先这样取:当和不足n时,a1取2,a2取3,…,am-1取m,即从2开始按照自然数的顺序取数,最后剩余的数给am,如果am=am-1,此时am跟前面的数字出现了重复,则把am从后面开始平均分布给前面的m-1个数。为什么要从后面开始往前呢?同样是考虑数据不出现重复的问题,如果是从前面往后面来平均分配,如2加上1以后变成3,就跟后面的已有的3出现了重复。这样操作到底是否正确、是否能保证乘积最大呢?还要加以证明。证明过程如下: 设两个整数a,b的和为2s,且ab,设a=s-1,则b=s+1,a*b=(s-1)*(s+1)=s2-1,如果a=s-2,则b=s+2,a*b=(s-2)*(s+2)=s2-4。 a-b的绝对值越小,乘积的常数项越大,即乘积越大,上面的序列a1, a2, a3, a4, …, am正好满足了a-b的绝对值最小。但是还要注意两个特例就是n=3和n=4的情况,它们的分解方案分别为1,2和1,3,乘积分别为2和3。 以n=10为例,先拆分为:10=2+3+4+1,最后一项为1,比4小,将其分配给前面的一项,得到10=2+3+5,所以最大的乘积为2*3*5=30。 以n=20为例,拆分为:20=2+3+4+5+6,正好是连续自然数的和,所以最大乘积为2*3*4*5*6=720。 再以n=26为例,先拆分为:26=2+3+4+5+6+6,因为最后一项为6,不比最后第二项大,所以将其平均分给前面的项,优先考虑后面的项,即前面的4项各分到1,笫5项6分到2,最后是26=3+4+5+6+8,所以最大的乘积为3*4*5*6*8=2880。 由于n可能大到10000,分解之后的各项乘积位数比较多,超过普通的数据类型的位数,所以要用到高精度运算来进行整数的乘法运算,将结果保存在数组里。 本题的贪心策略就是: 要使乘积最大,尽可能地将指定的n(n4)拆分成从2开始的连续的自然数的和,如果最后有剩余的数,将这个剩余的数在优先考虑后面项的情况下平均分给前面的各项。 基本算法描述如下: (1)拆分过程 拆分的数a先取2; 当na时做 Begin 选择a作为一项; a增加1; n减少a;

文档评论(0)

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

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

1亿VIP精品文档

相关文档