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

how to partition a series of numbers which maximizes the sum of products

给定一组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,1.99)。也就是说,根据不同的数字,它可能有很多条件。所以我被困了一会儿。 当数字只是实数时,事情就会变得更加困难。 如果有人能就这个问题给出指导,我将不胜感激~!非常感谢!!

when all numbers are in range [2,+∞), things are easy too, we could sort these numbers from large to small, and pick t numbers each time, then we could just partition these numbers or let left numbers in a group , then we could get the optimal partition.

我认为以这种方式对数字进行排序对于较小的数字也是一种很好的方法,尽管我们不能每次都选择 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()

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