【问题标题】:split one array into two parts which maximize the sum of product of element of each part将一个数组分成两部分,使每个部分的元素乘积之和最大化
【发布时间】:2012-08-13 07:50:44
【问题描述】:

我想将一个数组分成两部分。如果每个部分元素的乘积等于p1,p2。我们的目标是使 p1+p2 最大化。你能在多项式复杂性中找到它吗? 谢谢

【问题讨论】:

  • 有什么限制?会不会有负面因素?
  • 你对元素的顺序一无所知。因此,我们可以采取的第一步是对元素进行主动脉。这可以在多项式时间内完成
  • 没有负数或零元素
  • 它不能用动态规划来解决,因为你不能将问题分割成子问题并从中构建解决方案。

标签: arrays algorithm dynamic-programming


【解决方案1】:

由于没有负面元素,只需这样做:

foreach element in array
    if element < 1
         add to list1
    else
         add to list2

最大化产品的总和并在线性时间内运行。那么:

product1 = 1
foreach element in list1
    product1 = product1 * element

等等。请注意,这将导致空集的乘积为 1 - 这是正确的。

【讨论】:

  • “无负”假设不足以使该算法正确。例如:[1/2,1/2,1/2,1/2] 应该被平均分割:[1/2,1/2],[1/2,1/2] - 而算法会产生一个错误的答案。
  • 我理解正确吗?这两个列表是否都需要是原始列表的一半?因为如果不是,[1/2,1/2,1/2,1/2] 应该拆分成 [1/2,1/2,1/2,1/2], [] (en.wikipedia.org/wiki/Empty_product) . [1/2,1/2],[1/2,1/2] 将是最糟糕的解决方案。
  • 如果每个列表必须有至少一个元素,这又很容易解决 - 完成上述操作后,如果一个列表为空,则将最大元素移动到如果乘积 = 1,则为最小元素,这又是线性的。
猜你喜欢
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
相关资源
最近更新 更多