Java 如何对列表进行分区,使子列表的和大致相等

Java 如何对列表进行分区,使子列表的和大致相等,java,list,algorithm,sorting,sortedlist,Java,List,Algorithm,Sorting,Sortedlist,我有一个2000个或更少对象的排序列表,每个对象都有一个数值。我想知道如何(用Java)编写这样一种方法,将这个列表拆分为子列表,每个子列表大约有200个对象(有一定的回旋余地),这样每个子列表的值之和大致相等 即使完整列表中的对象少于2000个,我仍然希望每个子列表大约有200个对象。谢谢大家! 这里有一个快速而肮脏的贪婪方法,应该很有效 首先,决定你将得到多少份清单。称之为m 将对象分成m组,其中一个可能较小的组是最接近0的值 按最大值和最小值之间的差值降序排列分组 将组分配到列表中,最大的

我有一个2000个或更少对象的排序列表,每个对象都有一个数值。我想知道如何(用Java)编写这样一种方法,将这个列表拆分为子列表,每个子列表大约有200个对象(有一定的回旋余地),这样每个子列表的值之和大致相等


即使完整列表中的对象少于2000个,我仍然希望每个子列表大约有200个对象。谢谢大家!

这里有一个快速而肮脏的贪婪方法,应该很有效

首先,决定你将得到多少份清单。称之为
m

将对象分成
m
组,其中一个可能较小的组是最接近0的值

按最大值和最小值之间的差值降序排列分组

将组分配到列表中,最大的对象进入总数最低的组,次大的对象进入次低的对象,依此类推

完成后,您将拥有大小合适、差异相对较小的列表


(使用动态规划可以做得更好。但编写起来也会更困难。可能会给你一些如何做的想法。)

是的,按数值从高到低排序。首先确定要制作多少个列表。2000/200=10份清单。如果对象较少,
(N/200)
将给出至少200个对象的列表,
(N/200)+1
将给出最多200个对象的列表。这是假设所有列表都是相同长度的,但是所有列表具有相同总和的要求可能会阻止所有相同长度的列表。保持和近似相等的简单贪婪算法:从最大值开始,将项添加到和最小的列表中。优先级队列可用于加快查找具有最小和的列表的过程。这假定问题有满意的解决方案。可能没有解决办法。例如,假设您有1999个值为
1
的项目,以及一个值为
221
的项目。如果创建10个列表,每个列表包含200个项目,则9个列表的总和为200,而另一个列表的总和为420。但是如果10个列表的总和相等(即总和=222),那么9个列表将有222个项目,最后一个列表将有两个项目。简言之,这两个要求(相同的项目数量、相同的金额)是自相矛盾的,因此任何解决方案都无法满足所有可能的输入。感谢您的帮助!我同意这些要求相互矛盾,必须作出一些让步。幸运的是,该算法是最有效的。