给定n
和分区值k
,n1+n2+..nk=n
,我需要找到{n1,n2..,nk}
集,n1*n2*...nk
最大。< / p>
解决此问题的一种方法是列出所有子集,然后找到具有最大乘积的子集。有没有高效的算法(比蛮力更好)?
要查找子集,可以使用此公式,我目前正在使用this逻辑进行开发。
答案 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}
的情况下。
这进一步意味着您可以准确确定子集:如果您让a
为a*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
值可以相同。
修改强>
我有一些非常破碎的数学,但这里有一个证明为什么n1
和n2
必须相等,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
变量?也许有人可以延长这个答案。