我有N个不同文件大小的文件以及M个用户。
我想要做的是在C#,C ++或伪代码中使用一种算法,将算法平均分配给用户。
如果文件大小不在游戏中,那么它将类似于每个用户的N / M文件。因此,我可以为每个用户随机选择N / M文件(如果M> N并且没有剩下的文件,则可能有些用户无法参与)。但是,现在我在游戏中有文件大小,我想自动将文件分配给文件大小的用户。
文件只能与一个用户相关。因此,当文件与用户相关时,它不能再次使用。
用户可以与许多文件相关联。
如果文件少于用户(N> M),则某些用户可能会或根本不参与。
此外,这些情况可能是N< M,M> N和M = N,算法应该平等地将文件分发给用户。
如果有人可以帮助我,我将不胜感激。
谢谢。
答案 0 :(得分:3)
如果这是作业,它就是一个臭味!
它是partition problem的优化版本,它是NP-hard(即,你无法有效地解决它),即使你有只有两个用户。
有一种贪婪的算法可以很好地逼近最优排列,并在O(n log n)
时间内完成。如果我是你,那就是我想要的,除非你非常需要完美的最优性。这是伪代码,取自我上面链接的维基百科页面。这是两组(即M=2
),但很容易推广。基本思想是在每个阶段,将当前文件分配给总数最小的用户。
INPUT: A list of integers S
OUTPUT: An attempt at a partition of S into two sets of equal sum
1 function find_partition(S):
2 A ← {}
3 B ← {}
4 sort S in descending order
5 for i in S:
6 if sum(A) <= sum(B)
7 add element i to set A
8 else
9 add element i to set B
10 return {A, B}
原则上可以实现完美的最优性,但要考虑两个问题。
[8,4,4,4,4,4,4,0]
或[5,5,5,5,3,3,3,3]
?您需要一些明确定义的度量标准来确定&#34; badness&#34;在您尝试将其最小化之前进行分配。