Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用动态规划根据偏好划分组_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 使用动态规划根据偏好划分组

Algorithm 使用动态规划根据偏好划分组,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我需要一个帮助来设计一个算法,根据N个学生的偏好(一个组的偏好,两个或没有)将他们分成两组,这样我们就可以尽可能地匹配他们的偏好,并将他们平均分配给两个组。我应该用动态规划得到O(N^3) 所以我认为算法应该迭代N/2个学生并选择他们的偏好,剩下的就完成了。现在这取决于选择N/2学生的顺序,但我不知道这是否是一个好方法。如果有人能给我一个提示,谢谢 我应该用动态规划得到O(N^3) 太过分了。简单地挑选最喜欢的学生,让他加入他想加入的小组。重复上述步骤,直到至少有一组学生达到N/2。根据偏好强度

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

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

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

太过分了。简单地挑选最喜欢的学生,让他加入他想加入的小组。重复上述步骤,直到至少有一组学生达到N/2。根据偏好强度对学生进行排序,开始时为O(N logn),其余为O(N)


如果学生甚至没有偏好优势(我们尽量满足他们中的大多数),那么可以在O(N)个总时间内完成。对于您的情况,我假设以下动态规划解决方案

对于每个解决方案(即学生分组作业),让我们将其“成本”定义为错过的偏好数量。(如果首选项也有权重,您还可以在“成本”的定义中说明它们。)

现在,我们将有
ans[i][j]
作为将第一批
i
学生分成小组的最佳成本,以便第一批学生有
j
学生(因此第二批学生有
i-j
)。我们将使用dynamics编程填充
ans
数组。对于每个<代码> i < /> >和<代码> j>代码>考虑两种情况:将代码> i>代码>第1组或第二组。 对于第一种情况,成本将为
(将第i个学生分配到第1组的成本)+ans[i-1][j-1]
,因为在将第i个学生分配到第1组后,您必须将第i-1个学生分配到第1组,以便第一组有
j-1
学生

对于第二种情况,成本同样为
(将第i名学生安排到第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)
解决方案。

谢谢您的回复,但我必须使用动态编程。这是一项来自旧考试的任务。我相信这个问题有一个O(N)贪婪算法:根据学生的偏好(如果他们对其中一个或另一个有偏好,但不是两个或两个都有偏好)将学生分配到一个组中,直到你在一个组中的空间用完,或者你有偏好的学生用完为止。然后将其他所有人分配到剩余的空间。我认为它在O(N)时间和空间上给出了一个最优解。如果你必须使用动态规划,你必须,我想,但是O(N^3)真的太过分了。