Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.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
Java 求一组数的置换可用的最小增量_Java_Combinations_Combinatorics - Fatal编程技术网

Java 求一组数的置换可用的最小增量

Java 求一组数的置换可用的最小增量,java,combinations,combinatorics,Java,Combinations,Combinatorics,假设我们有一组12个对象,比如{1,2,3,4,5,6,7,8,9,10,11,12}。我们必须把这个集合分解成4个由3个对象组成的小集合,这样这4个集合的最大和和最小和就最小化了。我们必须找到这种差异。在我们的例子中,{1,7,12},(3,8,9},{4,5,10},{2,6,11}。这四个集合满足这个问题,因为它们的和是20和19,意味着δ1,我们的答案 如何解决任意12个值的问题 我试着将所述集合的所有分区枚举为4组3,并找到一个具有最佳分数的分区。然而,时间至关重要,因此我想知道如何在

假设我们有一组12个对象,比如{1,2,3,4,5,6,7,8,9,10,11,12}。我们必须把这个集合分解成4个由3个对象组成的小集合,这样这4个集合的最大和和最小和就最小化了。我们必须找到这种差异。在我们的例子中,{1,7,12},(3,8,9},{4,5,10},{2,6,11}。这四个集合满足这个问题,因为它们的和是20和19,意味着δ1,我们的答案

如何解决任意12个值的问题

我试着将所述集合的所有分区枚举为4组3,并找到一个具有最佳分数的分区。然而,时间至关重要,因此我想知道如何在Java中解决这个问题

我现在没有确切的代码,但实际上是9个嵌套循环,其中前三个嵌套是一个集合,下三个嵌套是下一个集合,最后三个嵌套是另一个集合,剩下的三个嵌套是另一个集合。我使用了一个2D数组,这样值将在分数[I][0]和分数[I][1]中将作为一个指标,让我知道分数[i][0]中的值是否已放入一个集合中


这当然会变得乏味和低效。

您可以通过找到求和必须接近的值来轻松简化问题,以实现更好的优化:

例如,在你的简单例子(1,2…12)中,每个项的总和是78。因此,每个组的总和必须非常接近78/4=19

那么,让我们尝试一个非常简单的算法:

- compute TOTAL_SUM = SUM(terms)
- compute TARGET_SUM = TOTAL_SUM / number(terms)
- set DELTA=0
- loop {
-    Try to split terms in groups where TARGET_SUM - DELTA <= SUM <= TARGET_SUM + DELTA
-    if a solution is found, exit
-    DELTA = DELTA + 1
-    }
-compute TOTAL\u SUM=SUM(术语)
-计算目标总和=总和/数量(项)
-设置DELTA=0
-环路{

-试着将术语分成小组,其中TARGET_SUM-DELTA请发布您迄今为止开发的任何代码。在这里寻求帮助的人必须证明自己已经做出了合理的努力来解决问题。这对于家庭作业来说更为重要。不是真正的家庭作业,只是我一直在思考的问题。但是,是的,请给我一个答案第二,是的,对……这就是为什么“时间至关重要”星期天晚上?时间是最重要的,我的意思是我想知道是否有更好的方法来解决这个问题,使它随着时间变得更灵活。我使用的方法基本上列出了所有可能的4-12集,并基本上测试了它的变化。将变化保存到一个局部变量,制作更多的4-set,如果new集合较小,将其设置为输出。冲洗,重复。好主意-此解决方案有意义,“拆分”应该不会太难实现。