LeetCode 第 343 題 (Integer Break)

liyuanbhu發表於2016-04-20

LeetCode 第 343 題 (Integer Break)

Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.

For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).

Note: you may assume that n is not less than 2.

作為一道程式設計題,這道題還是很簡單的。簡單的觀察就能知道拆出足夠多的 3 就能使得乘積最大。

int integerBreak(int n)
{
    if(n == 2) return 1;
    if(n == 3) return 2;
    int ret = 1;
    while( n>4 )
    {
        ret *= 3;
        n -= 3;
    }
    return ret * n;
}

這道題的難點其實在於證明為什麼拆出足夠多的 3

3
就能使得乘積最大。下面我就試著證明一下。

首先證明拆出的因子大於 4 是不行的。設 x

x
是一個因子,x>4
x > 4
,那麼可以將這個因子再拆成兩個因子 x2
x - 2
2
2
,易證 (x2)×2>x
(x - 2) \times 2 > x
。所以不能有大於 4 的因子。

4

4
這個因子也是可有可無的,4=2+2
4 = 2 + 2
4=2×2
4 = 2 \times 2
。因此 4
4
這個因子可以用兩個 2
2
代替。

除非沒有別的因子可用,1

1
也不能選作因子。一個數 x
x
當它大於 3 時,有 (x2)×2>(x1)×1
(x-2) \times 2 > (x-1) \times 1

這樣呢,就只剩下 2

2
3
3
這兩個因子可以選了。下面再證明 3
3
2
2
好。

一個數 x=3m+2n

x = 3 m + 2 n
,那麼 f=3m×2n=3m×2x3m2
f = 3^m \times 2^n = 3^m \times 2^{\frac{x - 3m}{2}}
可以對它取個對數。

lnf===mln3+nln2mln3+x3m2ln2x2ln2+(ln332ln2)m
\begin{eqnarray} ln f &=& m \ln 3 + n \ln 2 \\ &=& m \ln 3 + \frac{x - 3m}{2} \ln 2 \\ &=& \frac{x}{2} \ln 2 + (\ln3 - \frac{3}{2} \ln 2) m \end{eqnarray}

其中 ln332ln2>0

\ln3 - \frac{3}{2} \ln 2 > 0
所以 f
f
m
m
的增函式,也就是說 m
m
越大越好。所以 3
3
越多越好。

再多說一句,如果拆出的因子不限於整數的話,可以證明e=2.718

e = 2.718 \ldots
是最佳的選擇。感興趣的可以試著證明一下。

相關文章