我需要帮助设计一个算法,根据他们的偏好(一组的偏好,两者都没有)将N学生分成两组,这样我们就可以尽可能地匹配他们的偏好,并将它们平均分配给两个小组。我应该使用动态编程得到O(N ^ 3)。
所以我认为算法应该遍历N / 2个学生并选择他们的偏好,剩下的就完成了。现在它取决于选择这个N / 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
数组。对于每个i
和j
,请考虑两种情况:您将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)
解决方案。