LeetCode-343 Integer Break整数拆分乘积最大

作为一道编程题,这道题还是很简单的。简单的观察就能知道拆出足够多的 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这道题的难点其实在于证明为什么拆出足够多的 33 就能使得乘积最大。下面我就试着证明一下。

首先证明拆出的因子大于 4 是不行的。设 xx 是一个因子,x>4x>4,那么可以将这个因子再拆成两个因子 x2x−2 和 22,易证 (x2)×2>x(x−2)×2>x。所以不能有大于 4 的因子。

44 这个因子也是可有可无的,4=2+24=2+24=2×24=2×2。因此 44 这个因子可以用两个 22 代替。

除非没有别的因子可用,11 也不能选作因子。一个数 xx 当它大于 3 时,有 (x2)×2>(x1)×1(x−2)×2>(x−1)×1

这样呢,就只剩下 22 和 33 这两个因子可以选了。下面再证明 33 比 22 好。

一个数 x=3m+2nx=3m+2n,那么 f=3m×2n=3m×2x3m2f=3m×2n=3m×2x−3m2 可以对它取个对数。 

lnf===mln3+nln2mln3+x3m2ln2x2ln2+(ln332ln2)mlnf=mln⁡3+nln⁡2=mln⁡3+x−3m2ln⁡2=x2ln⁡2+(ln⁡3−32ln⁡2)m

其中 ln332ln2>0ln⁡3−32ln⁡2>0 所以 ff 是 mm 的增函数,也就是说 mm 越大越好。所以 33 越多越好。

再多说一句,如果拆出的因子不限于整数的话,可以证明e=2.718e=2.718… 是最佳的选择。感兴趣的可以试着证明一下。

猜你喜欢

转载自blog.csdn.net/ustcyy91/article/details/80712846