【问题标题】:Dividing to groups based on preferences using dynamic programming使用动态编程根据偏好分组
【发布时间】:2015-05-31 19:48:13
【问题描述】:

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

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

【问题讨论】:

  • 我相信有一个 O(N) 贪心算法可以解决这个问题:根据学生的偏好将学生分配到一个小组中(如果他们偏好其中一个,但不是两者都有或两者都没有),直到您的小组空间不足,或者您有偏好的学生人数不足。然后将其他所有人分配到剩下的任何空间。我声称这给出了 O(N) 时间和空间的最优解。如果你必须使用动态规划,你必须,我想,但 O(N^3) 实在是太过分了。

标签: algorithm dynamic-programming


【解决方案1】:

我应该使用动态规划得到 O(N^3)。

矫枉过正。只需挑选最喜欢的学生并将他放入他想加入的小组。重复直到至少一个小组有 N/2 名学生。一开始按偏好强度对学生进行排序是 O(N log N),其余是 O(N)。

如果学生甚至没有偏好优势(我们试图满足他们中的最大数量),那么它可以在 O(N) 总时间内完成。

【讨论】:

  • 感谢您的回复,但我必须使用动态规划。这是旧考试的任务。
【解决方案2】:

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

对于每个解决方案(即将学生分配到小组),让我们将其“成本”定义为错过偏好的数量。 (如果偏好也有权重,您也可以在“成本”的定义中考虑它们。)

现在我们将ans[i][j] 作为分配第一个i 学生分组的最优成本,这样第一组就有j 学生(因此第二组有@ 987654325@)。我们将使用动态编程填充ans 数组。对于每个ij 考虑两种情况:您将ith 学生放在第一组或第二组。

对于第一种情况,费用将为(cost of putting i-th student to group 1)+ans[i-1][j-1],因为在您将ith 学生放入第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) 解决方案。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2018-05-17
    • 2010-09-07
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多