给定排名的人员,我如何有效地将他们分为2个平衡的团队?

时间:2019-04-22 06:37:15

标签: math runtime

例如,我可以有4个人排名 [1、2、3、4] 。如何有效地(如果可能,在线性时间内)组建两个均衡的团队 [1,4],[2,3]

通过平衡,我希望它们的总和尽可能接近并且它们的大小相等(偶数池)或相差1(奇数池)。

任何帮助将不胜感激。谢谢。

修改

我能够弄清楚。有几种情况,一旦我确定了该列表属于哪个类别,它就非常简单。

1 个答案:

答案 0 :(得分:1)

这是一种subset sum problem,但子集大小受到限制。

可以通过在O(n*Sum)时间内进行动态编程来解决此问题(如果Sum具有合理的限制,则适用)。

目标是通过Sum/2个项目获得n/2 +-1的价值。


对于1..n范围内的值的特定情况:

N个偶数:获取对(1,n), (2,n-1)...(n/2, n/2 + 1)
N个奇数:获取对(2,n), (3,n-1)...((n + 1)/2, (n + 1)/2 + 1)并将左1添加到任何组