Java 从较大的列表中找出两个相等和的列表

Java 从较大的列表中找出两个相等和的列表,java,algorithm,Java,Algorithm,基本上我有一个整数列表或一个整数数组 列表=(1,3,22,17,22,4,15,40) 我需要找到两个这样的列表: 列表1=(1,3,17,4,15,22)。。。总和=62 清单2=(22,40)。。。总和=62 应使用所有整数,整数应位于列表1或列表2中 ----我的第一个想法---- 上面的列表是一个示例列表。。。如果可能的话,我应该能够找到任何给定列表的列表1和列表2 第一步是找到列表中所有元素的总和。这将始终是您要查找的两个子列表之和的两倍。以你的例子来说,(1,3,22,17,22,

基本上我有一个整数列表或一个整数数组

列表=(1,3,22,17,22,4,15,40)

我需要找到两个这样的列表:

列表1=(1,3,17,4,15,22)。。。总和=62

清单2=(22,40)。。。总和=62

应使用所有整数,整数应位于列表1或列表2中

----我的第一个想法----


上面的列表是一个示例列表。。。如果可能的话,我应该能够找到任何给定列表的列表1和列表2

第一步是找到列表中所有元素的总和。这将始终是您要查找的两个子列表之和的两倍。以你的例子来说,(1,3,22,17,22,4,15,40)之和是124,是62的两倍

现在你要在列表中寻找一组总数为62的数字。你不必担心找到两个集合(如果你找到了一个,剩下的数字肯定也会加起来是62)。我会通过算法来实现这一点——首先查找一组大小为1的元素,其元素之和为62(即,遍历列表并检查是否有任何数字为62)。如果存在这样一个数字,你就完了。如果没有,接下来查找大小为2的集合。这很棘手,因为你必须考虑所有可能的组合。因为您有7个数字,所以有(7*6)/2=21种可能性。如果其中任何一个是62,你就完了。如果没有,请继续检查大小为3的集合。依此类推,直到你达到7/2码(在本例中,你是3码)。显然,对于大集合,这个过程将涉及大量的计算和比较;它可以通过一些快捷方式进行优化,但基本算法是相同的


如果最后没有找到求和到62的子集,那是因为不存在这样的子集。

第一步是找到列表中所有元素的总和。这将始终是您要查找的两个子列表之和的两倍。以你的例子来说,(1,3,22,17,22,4,15,40)之和是124,是62的两倍

现在你要在列表中寻找一组总数为62的数字。你不必担心找到两个集合(如果你找到了一个,剩下的数字肯定也会加起来是62)。我会通过算法来实现这一点——首先查找一组大小为1的元素,其元素之和为62(即,遍历列表并检查是否有任何数字为62)。如果存在这样一个数字,你就完了。如果没有,接下来查找大小为2的集合。这很棘手,因为你必须考虑所有可能的组合。因为您有7个数字,所以有(7*6)/2=21种可能性。如果其中任何一个是62,你就完了。如果没有,请继续检查大小为3的集合。依此类推,直到你达到7/2码(在本例中,你是3码)。显然,对于大集合,这个过程将涉及大量的计算和比较;它可以通过一些快捷方式进行优化,但基本算法是相同的


如果最后没有找到求和到62的子集,那是因为不存在这样的子集。

第一步是找到列表中所有元素的总和。这将始终是您要查找的两个子列表之和的两倍。以你的例子来说,(1,3,22,17,22,4,15,40)之和是124,是62的两倍

现在你要在列表中寻找一组总数为62的数字。你不必担心找到两个集合(如果你找到了一个,剩下的数字肯定也会加起来是62)。我会通过算法来实现这一点——首先查找一组大小为1的元素,其元素之和为62(即,遍历列表并检查是否有任何数字为62)。如果存在这样一个数字,你就完了。如果没有,接下来查找大小为2的集合。这很棘手,因为你必须考虑所有可能的组合。因为您有7个数字,所以有(7*6)/2=21种可能性。如果其中任何一个是62,你就完了。如果没有,请继续检查大小为3的集合。依此类推,直到你达到7/2码(在本例中,你是3码)。显然,对于大集合,这个过程将涉及大量的计算和比较;它可以通过一些快捷方式进行优化,但基本算法是相同的


如果最后没有找到求和到62的子集,那是因为不存在这样的子集。

第一步是找到列表中所有元素的总和。这将始终是您要查找的两个子列表之和的两倍。以你的例子来说,(1,3,22,17,22,4,15,40)之和是124,是62的两倍

现在你要在列表中寻找一组总数为62的数字。你不必担心找到两个集合(如果你找到了一个,剩下的数字肯定也会加起来是62)。我会通过算法来实现这一点——首先查找一组大小为1的元素,其元素之和为62(即,遍历列表并检查是否有任何数字为62)。如果存在这样一个数字,你就完了。如果没有,接下来查找大小为2的集合。这很棘手,因为你必须考虑所有可能的组合。因为您有7个数字,所以有(7*6)/2=21种可能性。如果其中任何一个是62,你就完了。如果没有,请继续检查大小为3的集合。依此类推,直到你达到7/2码(在本例中,你是3码)。显然,对于大集合,这个过程将涉及大量的计算和比较;它可以通过一些快捷方式进行优化,但基本算法是相同的


如果最后没有找到求和到62的子集,那是因为不存在这样的子集。

一般来说,您的问题是一个NP难问题,这意味着随着数组n的增大,可能不存在快速(多项式时间)解。但是,如果您的数字是相对较小的整数(这意味着它们的绝对值之和大约为10亿或100亿或更少,具体取决于您的内存大小),则可以使用动态编程。基本上,对于数组的前k个元素,可以存储所有可能的与这些k个元素的子集的和。通过获取由前k个元素的子集构成的所有和,然后添加数组的第(k+1)个元素或不添加该元素,可以增量增加k,其中
Choose the largest nb i.e 40 and try to find integers equal to 40 and add 
to the second list ... But that's not the way ...