问题描述
给定一组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()
请注意,我没有考虑负数。