將一個整數拆分使其乘積最大


class Solution 
{
public:
    int integerBreak(int n) 
    {
        int Max,ThreeIndex,TwoIndex;
        if (n < 4)
        {
            if (n>2)
                return 2;
            return n == 2 ? 1 : 0;
        }
        if (n % 2)
        {
            TwoIndex = ((n - 3) % 6) / 2 ;
            ThreeIndex = (n - 3) / 6 * 2 + 1;
            Max = pow(3, ThreeIndex) * pow(2,TwoIndex);
        }
        else
        {
            TwoIndex = n % 6 / 2;
            ThreeIndex = n / 6 * 2;
            Max = pow(3, ThreeIndex)*pow(2, TwoIndex);
        }
        return Max;
    }
};

最優化問題,盡量都分成3,不足部分就分成2。

 
         

對於 n < 4,可以驗證其分解成幾個正整數的和的乘積是小於 n 的。
對於 n >= 4, 能證明其能分解成幾個數的和使得乘積不小於 n。
如果分解成 1 和 n - 1,那么對乘積是沒有幫助的,因此,假設 n
分解成 a 和 n - a,2 <= a <= n - 2,那么
     a * (n - a) - n
  = (a - 1) * n - a * a + a - a
  = (a - 1) * (n - a) - a
>= (a - 1) * 2 - a
  = a - 2
>= 0
如果 a, n - a 仍然 >= 4,那么繼續分解,直至 a, n - a < 4。因為每次分解都能使乘積
增加,所以最優解必是最終分解結果,也即分解出的數全是 2 或 3 。
(1)
假設 n 是偶數,且分解成 a 個 2 和 b 個 3,即 n = 2 * a + 3 * b,則乘積為 2a * 3b。
注意到 23 < 32 且 2 * 3 = 3 * 2 = 6,所以每 3 個 2 換成 2 個 3 會使乘積更大,因此,
最優方案是分解成 n/6*2 個 3 和 n%6/2 個 2,乘積為 3n/6*2 * 2n%6/2。
(2)
假設 n 是奇數,則一定需要分出一個 3,然后 n - 3 就是偶數。因此最優方案是分解出
(n-3)/6*2+1 個 3 和 (n-3)%6/2 個 2,乘積為 3(n - 3)/6*2+1 * 2(n-3)%6/2。

 

 


免責聲明!

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



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