说我有100个数字的列表,我想将它们分成5组,每组中的总和最接近数字的平均值。
最简单的解决方案是对100个数字进行排序并获取最大数字并继续添加最小数字,直到总和超出平均值。
显然,这不会带来最好的结果。我想我们可以使用BFS或DFS或其他一些搜索算法。喜欢A *以获得最佳效果。有人有一个简单的解决方案吗?伪代码就够了。谢谢!
答案 0 :(得分:0)
这听起来像knapsack problem的变体,如果我正确地解释你,它可能是multiple knapsack problem。难道你不能提出一个简单的问题吗? :)
答案 1 :(得分:0)
可以使用的一种有效算法(解决方案)是“最佳装箱”算法的一种变体。但是,我们必须采用一种变体,其中要明确地指定5个不同的数字组,而不是寻找使用最小数量的组。
该算法从查找所有100个数字的列表的平均值开始。该均值将用作我们试图使数字适合的所有5个组(箱)的最大容量。然后,我们在100个号码列表中找到最大数目,该数目不超过组的最大容量,并将其分配给第一个组。 (我们可以在log(n)时间找到它,因为我们可以使用自平衡二进制搜索树)。我们跟踪当前小组的工作量。然后,我们找到适合当前组的下一个最大数字,直到达到最大容量或没有其他数字可以使该组达到最大容量。在这两种情况下,我们都移至下一组,并使用数字列表中剩余的数字重复我们的算法。一旦离开一个小组,我们还必须跟踪该小组的当前总和。我们继续进行直到达到所有5组的最高容量为止。如果有剩余数字,我们会将它们放在总和最低的组中(因为我们在进行过程中一直跟踪这些总和)。 实际上,由于装箱的性质,这是一个具有Θ(nlogn)运行时间的贪婪算法。