最大化数字的乘积

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大化数字的乘积相关的知识,希望对你有一定的参考价值。

给定n和分区值kn1+n2+..nk=n,我需要找到{n1,n2..,nk}这样的集n1*n2*...nk最大。

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

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

答案

这是我现在有的一个想法。

如果数字是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

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变量?也许有人可以扩展这个答案。

另一答案

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

因为对数是一个凹函数,所以这个最大值将在k-uplets上获得,这样两个值之间的差异不会超过两个(因为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

以上是关于最大化数字的乘积的主要内容,如果未能解决你的问题,请参考以下文章

最大化数字的乘积

数据结构和算法||6,连续数字最大乘积

动归 p1018 乘积最大

c_cpp 两个数字的最大乘积

152乘积最大子序列

2021-10-18:乘积最大子数组。给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。力扣152。