贪心算法----正整数分解问题 和相同,乘积最大
2016-11-13 11:17
971 查看
转载自cxm_hy的博客,网址:
http://www.cnblogs.com/cxmhy/p/4491009.html?utm_source=tuicool&utm_medium=referral
一、问题描述
设n是一个正整数。现在要求将n分解为若干个自然数之和,且使这些自然数的乘积最大。
本文将这个大问题分解为两个小问题:
(1)这些自然数是互不相同的
(2)这些自然数可以是相同的
二、解决思路
这其实是个数学问题,总体上的宗旨就是分解的数越接近,它们的乘积是最大的,而且不要分解出1,至少从2开始。
针对(1)这个问题,因为这些若干个自然数是不相同的,所以只能是从2开始分解,如2,3,4...这种顺序
在这里,我们把这个分解问题具体化:
9=2+3+4,刚好可以分解这三个连续的数;
10=2+3+4+1,因为1不会增大乘积,反而会占据和,所以应该将其加到前面三个数上,为了保证最大而且互不相同,加到4上,则分解为10=2+3+5;
11=2+3+4+2,如果把2直接加到4上,乘积是2*3*6=36;如果分别加到连续的数上,如3,4,保证这些数之间的差距是最小的,那么乘积是2*4*5=40;
12=2+3+4+3;则这个三分成三个一,加到前面三个数上,保证了连续性;
13=2+3+4+4;因为是四个一,所以我们采取的方法是最后一个数加2,其他加1,那么乘积是:3*4*6=72;
因此总体的策略就是先分解成连续的自然数,将剩余的数按照从后往前的次序一次均匀分配。
针对(2)问题,因为分解的数是可以相同的,所以先比较一下分解成相同的数和不同的数哪种的乘积大。如
6=3+3;6=2+4;
3*3=9;
2*4=8;
所以分解为相同的数保证之间的差距最小,从而乘积也是最大的。自然知道了分解成相同的数的优势后,对于一个整数,我们应该尽可能多得分解成哪种数呢?
对于4来说,只能拆成2+2,因为要避免拆1;且2*2的效果与本身大小是一致的;
对于5来说,只能拆成2+3,因为要避免拆1;且2*3的效果大于5本身;
对于6来说,拆成3+3的效果(9)要好于2+2+2的效果(8);
对于7而言,拆成3+4的效果是最好的;
对于8而言,我们可能第一反应是4+4,效果是16;但是实际上最优的分解式3+3+2,效果是18;
对于10来说,理论上是10=5+5;
但是鉴于5本身还有更好的分解,所以10=(2+3)+(2+3);
所以分解拆数的策略是:先分解成尽可能多得3,然后再分解成2,不要分出1!
考虑任意的一个数,它除以3后的情况只有3种:
(1)整除,余数是0,如9,分解成3+3+3就是最优的;
(2)不整除,余数是1,如10,分解成3+3+4或者3+3+2+2;除了三之外其余的就用2或者4;
(3)不整除,余数是2,如11,分解成3+3+3+2;
三、程序设计
(1)自然数不相同:
(2)分解成可以相同的自然数
四、程序结果
(1)不相同整数的情况:
2*3*5=30;
(2)可以相同整数的情况
3*3*2*2=36;
http://www.cnblogs.com/cxmhy/p/4491009.html?utm_source=tuicool&utm_medium=referral
一、问题描述
设n是一个正整数。现在要求将n分解为若干个自然数之和,且使这些自然数的乘积最大。
本文将这个大问题分解为两个小问题:
(1)这些自然数是互不相同的
(2)这些自然数可以是相同的
二、解决思路
这其实是个数学问题,总体上的宗旨就是分解的数越接近,它们的乘积是最大的,而且不要分解出1,至少从2开始。
针对(1)这个问题,因为这些若干个自然数是不相同的,所以只能是从2开始分解,如2,3,4...这种顺序
在这里,我们把这个分解问题具体化:
9=2+3+4,刚好可以分解这三个连续的数;
10=2+3+4+1,因为1不会增大乘积,反而会占据和,所以应该将其加到前面三个数上,为了保证最大而且互不相同,加到4上,则分解为10=2+3+5;
11=2+3+4+2,如果把2直接加到4上,乘积是2*3*6=36;如果分别加到连续的数上,如3,4,保证这些数之间的差距是最小的,那么乘积是2*4*5=40;
12=2+3+4+3;则这个三分成三个一,加到前面三个数上,保证了连续性;
13=2+3+4+4;因为是四个一,所以我们采取的方法是最后一个数加2,其他加1,那么乘积是:3*4*6=72;
因此总体的策略就是先分解成连续的自然数,将剩余的数按照从后往前的次序一次均匀分配。
针对(2)问题,因为分解的数是可以相同的,所以先比较一下分解成相同的数和不同的数哪种的乘积大。如
6=3+3;6=2+4;
3*3=9;
2*4=8;
所以分解为相同的数保证之间的差距最小,从而乘积也是最大的。自然知道了分解成相同的数的优势后,对于一个整数,我们应该尽可能多得分解成哪种数呢?
对于4来说,只能拆成2+2,因为要避免拆1;且2*2的效果与本身大小是一致的;
对于5来说,只能拆成2+3,因为要避免拆1;且2*3的效果大于5本身;
对于6来说,拆成3+3的效果(9)要好于2+2+2的效果(8);
对于7而言,拆成3+4的效果是最好的;
对于8而言,我们可能第一反应是4+4,效果是16;但是实际上最优的分解式3+3+2,效果是18;
对于10来说,理论上是10=5+5;
但是鉴于5本身还有更好的分解,所以10=(2+3)+(2+3);
所以分解拆数的策略是:先分解成尽可能多得3,然后再分解成2,不要分出1!
考虑任意的一个数,它除以3后的情况只有3种:
(1)整除,余数是0,如9,分解成3+3+3就是最优的;
(2)不整除,余数是1,如10,分解成3+3+4或者3+3+2+2;除了三之外其余的就用2或者4;
(3)不整除,余数是2,如11,分解成3+3+3+2;
三、程序设计
(1)自然数不相同:
(2)分解成可以相同的自然数
四、程序结果
(1)不相同整数的情况:
2*3*5=30;
(2)可以相同整数的情况
3*3*2*2=36;
相关文章推荐
- 把自然数N分解成若干个互不相同的正整数,使乘积最大
- poj 1032 Parliament 把自然数N分解成若干个互不相同的正整数,使乘积最大;
- 正整数分解使得乘积最大问题
- 整数分解之和最大问题(全分成3,少分成2)
- 整数拆分并且乘积最大问题
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 有一个整数n,将n分解成若干个整数之和,问如何分解能使这些数的乘积最大,输出这个乘积m
- 数和分解,乘积最大-vijos整数分解(版本2)
- (Relax 水题1.2)POJ 1032 Parliament(将n分解成若干个互不相等的整数的和,并且是这些整数的乘积最大)
- 贪心算法求所有分解方法中各加数乘积的最大值
- 输出正整数分解的所有数的最大乘积
- 贪心算法——最大整数分解最大乘积
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 整数分解成不同加数的最大乘积
- (Relax 水题1.2)POJ 1032 Parliament(将n分解成若干个互不相等的整数的和,并且是这些整数的乘积最大)
- 贪心算法——输入任意一个正整数N,将其分成多个互不相同的整数,和为N,乘积最大
- JAVA代码—算法基础:整数拆分求最大乘积问题
- 整数分解为质数的乘积
- 活动选择问题(活动安排问题)(最大数目活动选择问题)贪心算法C++实现
- 积最大的整数分解