Java 输入为int数组,获取所有子集
我想要得到可能的子集,例如:输入是{1,2,3} 预期结果:Java 输入为int数组,获取所有子集,java,algorithm,Java,Algorithm,我想要得到可能的子集,例如:输入是{1,2,3} 预期结果: 1 2 3 1,2 1,3 1,2,3 2,3 我用递归来实现它,它觉得很慢,有没有更有效的方法?你可以考虑一种递归方法: 如果你只有一个数字,这是唯一可能的总和 如果您有多个号码,则每个号码的号码都有: 取它与所有可能的和结合的数,其余的数也是和 伪代码: allsums = makeAllSums(setOfNumbers){ if(1==setOfNumbers.size) return setOfNumbers.
1
2
3
1,2
1,3
1,2,3
2,3
我用递归来实现它,它觉得很慢,有没有更有效的方法?你可以考虑一种递归方法:
allsums = makeAllSums(setOfNumbers){
if(1==setOfNumbers.size)
return setOfNumbers.head
result = emptySet
for(a in setOfNumbers)
allSubSums=makeAllSums(setOfNumbers without a);
for(b in allSubSums)
result.add(a."+".b)
return result
}
这是的一个变体,可以在O(n*SUM)
中解决,其中SUM
是所有数字的总和,使用
在这里,
D(i,x)
给出一个布尔值,该值指示使用部分或全部i
第一个元素是否可以达到sumx
。因此,对于每个可能的和x
,D(n,x)
指示是否可以使用任何数字达到该和。基于要添加到和的元素的二进制数表示的想法从初始设置开始
1 2 3 4 5 6 7 9 10
每个可能的总和都可以写为8位二进制数,其中每个数字代表“在总和中取此”或“在总和中不取此”
例如:
001010100 means 3+5+7
111111111 means 1+2+3+4+5+6+7+9+10
000000001 means 10
010000000 means 2
所以每一个可能的和都可以写成一个长度为9的0和1的序列
所有和都是长度为9的可能序列
因此,您可以简单地对数字1到2^9-1进行循环,并将二进制表示形式解释为求和
000000001 : 10
000000010 : 9
000000011 : 9 + 10
000000100 : 7
000000101 : 7 + 10
...
111111111 : 1+2+3+4+5+6+7+9+10
这样你就可以得到所有的和(没有重复)是的,我也考虑递归,但是“把它和所有可能的和结合起来”,我不知道怎么做it@Tony翟:我为递归解决方案添加了伪代码,这是编程竞赛吗?你能提供一个问题的链接吗?如果有很多数字输入序列,8位二进制足够吗?@Tony Zhai你的例子有9个数字,所以我在我的例子中使用了9位二进制值。位数必须与输入集中的位数相匹配。我读过动态编程,但仍然不知道如何编写代码。你能帮我吗?我们可以在一些im工具上聊天,但是你的评论非常有用,现在,我知道我需要找到所有子集,然后得到它们,我想使用动态规划来找到答案,我希望你能给我一些帮助,这就是我如何看待这一点question@CarlXu你读过我提供的关于动态规划和子集和问题的链接吗?你知道如何用你最喜欢的编程语言实现D(i,x)作为递归函数吗?这对我来说太复杂了,你能提供一些关于DP的简单文档吗
000000001 : 10
000000010 : 9
000000011 : 9 + 10
000000100 : 7
000000101 : 7 + 10
...
111111111 : 1+2+3+4+5+6+7+9+10