【发布时间】:2012-10-18 04:44:15
【问题描述】:
我真的需要一位算法大师!所以问题是我得到了一个这样的数组:
[
[870, 23]
[970, 78]
[110, 50]
]
我想把它拆分,让它看起来像这样:
// first array
[
[970, 78]
]
// second array
[
[870, 23]
[110, 50]
]
那么现在,为什么我也想让它看起来像这样?
因为我想让子值的总和尽可能相等。所以970 大约是870 + 110 而78 大约是23 + 50。
所以在这种情况下这很容易,因为如果你只是拆分它们并且只查看第一个子值它已经是正确的但我想检查两者并保持它们尽可能相等,这样它也可以使用一个包含 100 个子数组的数组!所以如果有人能告诉我我可以用什么算法来编程,那就太好了!
天平:
- ~1000 个元素(子列表)在数组中
- 元素是最大为 10^9 的整数
我正在寻找“足够接近的解决方案” - 它不一定是确切的最佳解决方案。
【问题讨论】:
-
@FelixKling 不,这不是重复的,他想根据一个总和而不是两个总和将一个数组分成两个子数组,实际上还有更多的问题是问这个。
-
嗯,我还是会说这基本上是同一个问题,只是更难;)答案链接到en.wikipedia.org/wiki/Partition_problem,这应该为您解决该问题提供了一个良好的开端。
-
@FelixKling 是的,没错,但不仅仅是有点难,解决起来要困难得多。
-
@FelixKling 这不是分区问题,其他答案也是错误的。分区问题是当您需要从数组中获取子集时,在这里您只需要选择“分区点” - 您获取子数组,而不是子集。通过检查每个可能的“分区”点并检查总和,蛮力解决方案是
O(n^2)。 (当然,除非它可以是任何子集,而不是子数组 - 然后是分区问题,但问题只是令人困惑)
标签: javascript jquery arrays algorithm