博客开通啦。本博客内容近期内主要为各种基础算法的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] .对的哈
浙公网安备 33010602011771号