最大化数字的乘积
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大化数字的乘积相关的知识,希望对你有一定的参考价值。
给定n
和分区值k
,n1+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
值可以相同。
编辑
我有一些非常破碎的数学,但这里有一个证明为什么要使n1
和n2
必须相等,因为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
。
以上是关于最大化数字的乘积的主要内容,如果未能解决你的问题,请参考以下文章
2021-10-18:乘积最大子数组。给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。力扣152。