使用动态编程根据首选项划分为组

时间:2015-05-31 09:41:46

标签: algorithm dynamic-programming

我需要帮助设计一个算法,根据他们的偏好(一组的偏好,两者都没有)将N学生分成两组,这样我们就可以尽可能地匹配他们的偏好,并将它们平均分配给两个小组。我应该使用动态编程得到O(N ^ 3)。

所以我认为算法应该遍历N / 2个学生并选择他们的偏好,剩下的就完成了。现在它取决于选择这个N / 2学生的顺序,但我不知道这是否是一个好方法。如果有人能给我一个提示,谢谢。

2 个答案:

答案 0 :(得分:1)

  

我应该使用动态编程获得O(N ^ 3)。

矫枉过正。只需选择最具偏好的学生并将他带入他想要进入的小组。重复直到至少有一个小组达到N / 2名学生。按开头的偏好强度对学生进行排序为O(N log N),其余为O(N)。

如果学生甚至没有优先权(我们尽量满足他们的最大数量),那么可以在O(N)总时间内完成。

答案 1 :(得分:1)

此声音与knapsack problem非常相似。对于您的情况,我会假设以下动态编程解决方案。

对于每个解决方案(即将学生分配到小组),让我们定义其成本"错过偏好的数量。 (如果偏好也有权重,您也可以在"费用"的定义中对其进行说明。)

现在我们将ans[i][j]作为将第一个 i学生分配到群组中的最佳成本,以便第一个群组拥有j学生(第二个因此有i-j)。我们将使用动态编程填充ans数组。对于每个ij,请考虑两种情况:您将i学生放在第一组或第二组。

对于第一种情况,费用为(cost of putting i-th student to group 1)+ans[i-1][j-1],因为在您将i学生安排到第1组后,您必须将i-1名学生分配到小组,以便第1组有j-1名学生。

对于第二种情况,费用同样为(cost of putting i-th student to group 2)+ans[i-1][j]

因此得到的DP公式是

ans[i][j]=min(cost[i][1]+ans[i-1][j-1], cost[i][2]+ans[i-1][j])

如果j=0只剩下第二个字词,那么i=j只有第一个。

这不是O(N^3),而是O(N^2)解决方案。