貪心算法----正整數分解問題 和相同,乘積最大


一、問題描述

設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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM