查找可用于一组数字的排列的最小增量

时间:2014-01-12 22:56:49

标签: java combinations combinatorics

假设我们有一组12个对象,比如说{1,2,3,4,5,6,7,8,9,10,11,12}。我们必须将这个集合分成由三个对象组成的4个较小的集合,以便最小化这四个集合中的最大和和最小和。我们必须找到这种差异。在我们的例子中,{1,7,12},(3,8,9},{4,5,10},{2,6,11}。这四个集合满足了这个问题,因为它们的总和是20和19,意思是delta为1,我们的回答。

如何为任意12个值解决这个问题?

我已经尝试将所述集合的所有分区枚举为4组3,并找到一个具有最佳分数的分区。但是,时间至关重要,所以我想知道如何在Java中解决这个问题

我现在没有确切的代码,但它本质上是9嵌套for循环,其中前三个嵌套是一组,接下来的三个是下一组,后三个是另一组,剩下的三个是另一套。我使用了2D数组,因此值将在得分[i] [0]中,得分[i] [1]将作为一个指示器让我知道得分[i] [0]中的值是否已被放置成套。

这当然会变得单调乏味。

1 个答案:

答案 0 :(得分:1)

您可以通过查找总和必须接近的值来轻松简化问题:

例如,在您的简单情况下(1,2 ... 12),则每个项的总和为78.因此,每个组必须具有非常接近78/4 = 19的总和。

所以,让我们尝试一个非常简单的算法:

- compute TOTAL_SUM = SUM(terms)
- compute TARGET_SUM = TOTAL_SUM / number(terms)
- set DELTA=0
- loop {
-    Try to split terms in groups where TARGET_SUM - DELTA <= SUM <= TARGET_SUM + DELTA
-    if a solution is found, exit
-    DELTA = DELTA + 1
-    }

好的,我没有帮助你“尝试分裂......”一步。但它应该看起来像你自己的解决方案,除了你有额外的约束,可以帮助你加快过程。

希望这有帮助。