Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 输入为int数组,获取所有子集_Java_Algorithm - Fatal编程技术网

Java 输入为int数组,获取所有子集

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
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
    第一个元素是否可以达到sum
    x
    。因此,对于每个可能的和
    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