Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Arrays 将整数数组拆分为3个相等和的数字块_Arrays_Algorithm_Sorting_Sum - Fatal编程技术网

Arrays 将整数数组拆分为3个相等和的数字块

Arrays 将整数数组拆分为3个相等和的数字块,arrays,algorithm,sorting,sum,Arrays,Algorithm,Sorting,Sum,我不知道我的措辞是否恰当,但我会在这里进一步解释: 因此,我有一个数字数组,比如说12345678910114,我需要编写一个算法,将数组拆分为3个数字大小的相等和的数组,在这种情况下是: {14,2,4}{11,6,3}{10,1,9}{5,7,8}-我想我明白了 所以,我现在脑子里想的是: 检查每个可能的整数和,并将使用的三个索引和总和放入一个结构中 然后,使用一个结构数组,我将按和对它们进行排序,并搜索N/3和的数量,如果找到,我将根据它们的索引打印出数字 该算法包括多次遍历所有数字,因此

我不知道我的措辞是否恰当,但我会在这里进一步解释:

因此,我有一个数字数组,比如说
12345678910114
,我需要编写一个算法,将数组拆分为3个数字大小的相等和的数组,在这种情况下是:

{14,2,4}{11,6,3}{10,1,9}{5,7,8}
-我想我明白了

所以,我现在脑子里想的是:

检查每个可能的整数和,并将使用的三个索引和总和放入一个结构中

然后,使用一个结构数组,我将按和对它们进行排序,并搜索
N/3
和的数量,如果找到,我将根据它们的索引打印出数字

该算法包括多次遍历所有数字,因此速度非常慢。有人能提出更好的算法吗?如果有人想给出一些代码,我可以用
C
编程,我已经开始学习
Java


谢谢大家!

你不会说你是否总是从12个数字开始

您有以下数字数组:12345678910114

  • 数字数组的计数必须能被3整除。如果没有,就没有解决办法

  • 对数字数组求和。在这种情况下,总和是80

  • 我们有12个数字,所以我们有4组,每组3个。将总和除以组数,即80/4或20。如果此除法不产生整数,则没有解决方案

  • 遍历数字数组,一次三个数字,一次,并将三个数字的总和保持为20。您可以使用12位二进制整数(从零开始,递增1)来选择三元组。当二进制整数有3个1位时,使用这些位的位置作为数字数组的索引

  • 检查三元组的组号是否存在,并使用数组中的所有数字。如果是这样,你有你的解决方案。如果没有,就没有解决办法

  • 编辑添加:问题中给出的数字数组有4种解决方案:

    (2,4,14); (3,6,11); (1,9,10); (5,7,8)
    (2,4,14); (1,8,11); (3,7,10); (5,6,9)
    (1,5,14); (3,6,11); (2,8,10); (4,7,9)
    (1,5,14); (2,7,11); (4,6,10); (3,8,9)
    

    我编写代码只是为了看看产生一个解决方案需要多长时间。它在不到一秒钟的时间内运行。

    嗯,这是一个难题。为它编写代码有点困难,如果有很多数字,可能需要很长时间才能解决

    首先,您要检查解决方案是否可行。你有12个数字(如果是11或13,你不能把它们分成3组),所以你想要4组3组。总数是80,这也很好,因为你现在需要四组三个数字,每个数字加起来是20;如果总数是79或78,那就行不通了

    按降序排列数字。最大的数字必须在某个组中,所以从14开始。14可以与5,1或4,2组合。你检查两种可能性

    下一个最大的数字必须在某个组中,所以我们取11。可与8,1或7,2或6,3或5,4组合。如果第一组是(14,5,1),那么第二组可以是(11,7,2)或(11,6,3)。如果第一组是(14,4,2),那么第二组可以是(11,8,1)或(11,6,3)。所以你的选择不会增长太多

    因此,您可以编写一个递归函数,每次再添加一个组;您添加的每个组都包含剩余的最大数字,再加上两个数字,因此总和为20;您必须删除已选择的号码。这是个粗略的想法

    (草图)动态规划方法:

    有一个3整数的数组。有一种方法可以将INT标记为已使用。将第一个未标记的数字添加到数组中,并将其标记为已使用。添加下一个未标记的数字,查看总和是否仍低于目标总和(您知道如何获得它)。换个号码试试。找出丢失的号码并查找(确保其未标记)。假设你找到了。你会有你的三胞胎(你把它存储在某个地方,这是我不打算简单介绍的记忆部分)。再找一个三胞胎

    将每个数字添加到三元组后,递归地查找下一个数字,这样,如果这个数字不起作用,您可以返回并尝试另一个组合。它的工作原理是,在某个时刻,您可能会到达数组的末尾,而不构建三元组。然后,您必须返回递归调用以尝试那边的其他号码

    只有在能够标记所有数字的情况下,才能完成此操作


    这里肯定有改进的余地,但如果您了解动态规划的含义,您应该了解它。

    Ye,有N个数字,不总是12。E:看完整篇文章后,我意识到我是多么愚蠢,因为我忽略了我们知道我们需要的金额这一点。。。非常感谢。另一个用户已经发布了一个简单的解决方案,但你的似乎更。。。有趣。我会在空闲时间试一试,谢谢!