如何划分使乘积之和最大化的一系列数字

问题描述

给定一组n个实数,我们想划分它们的乘积和最大,每组最多有t个数字。 我认为当所有数字都在 [0,1] 范围内时问题很容易,我们可以让每个数字都在一个唯一的组中,然后我们就可以得到最佳解决方案。同样,当所有数都在[2,+∞)范围内时,事情也很简单,我们可以将这些数从大到小排序,每次选择t个数,然后我们就可以将这些数进行分区或让左数在一个group ,那么我们就可以得到最佳分区。 但是当数字在 [1,2] 范围内时,事情会变得有点棘手。比如我们面对1.01、1.01、1.01时,最优解是(1.01)(1.01)(1.01);当我们面对(假设 t=3) 1.99,1.99,1.99 时,最优解是 (1.99,1.99)。也就是说,根据不同的数字,它可以有很多条件。所以我被困了一会儿。 当数字只是实数时,事情会变得更加困难。 如果有人能就这个问题提供指导,我将不胜感激~!非常感谢!!

解决方法

当所有数字都在[2,+∞)范围内时,事情也很简单,我们可以将这些数字从大到小排序,每次选择t个数字,然后我们就可以对这些数字进行分区或让左边的数字进入一组,那么我们就可以得到最优分区。

我认为这样对数字进行排序对于较小的数字也是一种很好的方法,尽管我们不能每次都选择 t 个数字,而是必须弄清楚要放入多少个数字下一个产品组,以最大化产品的总和。在接下来的 t 个数字中找到位置 p 就足够了,其中 p 之前的数字加上 p 之后的数字之和最大。以下代码应打印反向排序列表 numbers 的结果:

i = 0
while i < len(numbers):
    p = max(range(1,t+1),key = lambda k: numpy.prod(numbers[i:i+k])+sum(numbers[i+k:i+t]))
    if i: print(" + ",end="")
    print(*numbers[i:i+p],sep="*",end="")
    i += p
print()

请注意,我没有考虑负数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...