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