博客开通啦。本博客内容近期内主要为各种基础算法的python3实现,偶尔给出c++实现。

  第一个小问题,练习下排版。

  群里有人问的:已知一个自然数S(S>=10)可以分成n个自然数之和,S=a1+a2+.......+an;求一种分法使的a1*a2*......*an最大,写出实现的函数,并数学理论推导一下证明你的算法。,请问下这题目

  感谢钱博士给出的证明:给定一个数,你可以观察到,当所有的partition是相等的情况下,它们的乘积最大。根据这个观察,可以求partition的值。如果N是给定的数,X是partition的值,最终的乘积P可以表示为,P=X^(N/X)。我们要求可以使P最大的X的值。两边取ln()。ln(P)=(N/X)ln(X)。求导之后取0值,得到(N/(X^2))(1-ln(X))=0。得到X=e。但e不是整数,所以如果去整数可以取到3。partition的数量是N/3并且向下取整。当N mod 3=0时,partition只有3,当N mod 3=1时,从floor(N/3)中拿到一个3,从而会有两个2,当N mod 3 =2时,会有1个2。

  根据上面的解答,给一个实现,函数名字随便起的:

  

def devide_by_max_multiply(num):
    if num % 3 == 0:
        return [3] * (num // 3)
    elif num % 3 == 1:
        return [3] * (num // 3 - 1) + [2, 2]
    else:
        return [3] * (num // 3) + [2]

 

  分别测试9、10、11的结果,为[3,3,3], [3, 3, 2, 2], [3, 3, 3, 2]  .对的哈

posted on 2016-11-13 13:22  谁带我打大秘境  阅读(236)  评论(1)    收藏  举报