最大化数字的乘积

时间:2015-06-02 10:31:22

标签: algorithm math

给定n和分区值kn1+n2+..nk=n,我需要找到{n1,n2..,nk}集,n1*n2*...nk最大。< / p>

解决此问题的一种方法是列出所有子集,然后找到具有最大乘积的子集。有没有高效的算法(比蛮力更好)?

要查找子集,可以使用此公式,我目前正在使用this逻辑进行开发。

2 个答案:

答案 0 :(得分:11)

最大化产品n1*n2*..*nk相当于最大化其对数log(n1*n2*..*nk) = log(n1)+log(n2)+ .. +log(nk),但受约束n1+..+nk = n

的限制

因为对数是一个凹函数,所以这个最大值将在k-uplet上获得,这样两个值之间的差异不会超过两个(因为log((a+b)/2) >= (log(a)+log(b))/2。这意味着,定义x = floor(n/k),您可以将自己限制在每个n_i属于{x,x+1}的情况下。

这进一步意味着您可以准确确定子集:如果您让aa*x+(k-a)*(x+1) = n,那么最大子集将是一个排列 n1 = x, n2 = x, .., n_a = x, n_{a+1} = x+1, .., nk = x+1.
可以明确解决a上的等式并生成a = k*(ceil(n/k))-n

答案 1 :(得分:3)

这是我现在的一个想法。

如果数字为n,并且k可以完全整除,那么我们的数字n/k会出现k次,这就是总和有效。另外,请注意,在这种情况下,当我们使用n/k k完美地除n时,结果乘法的结果将是最大的。如果它不是一个完美的除数,那么我们可以找到ceil(n/k)*k并乘以ceil(n/k) k-1次,并且n - (ceil(n/k) * (k-1))可以找到最后一个整数。

假设n_i值可以相同。

修改

我有一些非常破碎的数学,但这里有一个证明为什么n1n2必须相等,n1 * n2时最多为A = n1 + n2。< / p>

A = n1 + n2
n2 = A - n1;

P = n1 * n2
P = n1 * (A - n1) = A * n1 - n1^2

Differentiating P with respect to n1

dP/dn1 = A - 2 * n1 

To find the inflection point, we do dP/dn1 = 0 and solve

A - 2 * n1 = 0
n1 = A/2

which indicates n1 = A/2 and therefore n1 = n2

Which tells to make to make P maximum (as the double differentiation is negative), we need to have n1 = n2

我认为这个证据可以扩展到k变量?也许有人可以延长这个答案。