1

所以我试图为一个程序找出一个算法,该算法将使用递归来获取一个 x 数的 int 数组并将其分成 n 个集合。这些数字可以是正数也可以是负数。这些集合需要在它们之间具有尽可能小的差异。

例如,如果你给程序一个 int 数组 [1, 2, 3, 4] 并告诉它分成 3 组,那么它将把它分成 [1, 3] [2] 和 [4] 之间的区别集合是 2。另一个例子是如果你给数组 [6, 6, 6, 10, 10] 并告诉它分成 2 组,那么它将分成 [10, 10] 和 [6, 6, 6]其中集合之间的差异为2。

我们可以假设数组按升序排序(左侧最小,右侧最大),因为排序将是一个简单的排序语句。有任何想法吗?

编辑:我知道我正在处理一个分区问题,我已经尝试过贪心算法,你从最大到最小的数字并将它们放在总和最低的组中,但它不适用于我上面给出的第二个示例所以我正在寻找更可靠的算法。

4

1 回答 1

0

更一般情况(k集合)中的分区问题称为最小制造跨度问题。这个问题是 NP 完全的k > 2。一个精确的算法,格雷厄姆列表调度算法k = 2,以和 而闻名k = 3。对于较大的尺寸,如果您不实施 NP 完全解决方案,则有许多多项式时间逼近算法。

于 2013-03-22T05:06:22.973 回答