在y槽中打印x对象的所有组合(Java)

时间:2011-06-16 21:03:01

标签: java combinations

如果你有x个对象(可以用1表示)放在y槽中(空槽可以表示为0),写一个函数打印对象可以放入的所有可能方式插槽。该方法将输入对象的数量和总槽数。

例如,possibleCombinations(3,5)应该打印3个对象可以放在5个插槽中的方式:

11100,11010,11001,10110,10101,10011,01110,01101,01011,00111

我认为递归是一种选择,但我不确定如何设置它以便它适用于任意数量的对象。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:4)

这是一些伪代码,显然我没有使用非常好的数据结构。但是如果可能的话,你可以看到每个电话,检查包含或不包括每个项目的情况,并从那里继续。那是else语句中的一对递归调用。

func(a,b)
case 0,0
  return null;
case a>b
  return null;
else
  return {1,func(a-1,b-1)} & {0,func(a,b-1)};

答案 1 :(得分:2)

这里有一些java代码:

public static void possibilities(int k,int n) {
    aux(k,n,new StringBuilder());
}
public static void aux(int k,int n,StringBuilder sb) {
    if (n == 0 && k == 0) {
        System.out.println(sb);
        return;
    } else if (n<k) {
        return;
    }
    if (k>0) { 
        aux(k-1,n-1,new StringBuilder(sb).append(1));
    }
    aux(k,n-1,new StringBuilder(sb).append(0));
}

aux()实际上做了工作,它完成了所有可能性:添加0或添加1,最后只打印那些“使用”所有可能的1的

编辑:更改了递归结束条件,以修剪最后不会打印的案例。

答案 2 :(得分:0)

这提醒我,您可以在wolframalpha.com搜索Permutations[Join[Table[1, {3}],Table[0, {5-3}]]]并获得正确答案。

这个答案的步骤是:

  • 创建1的集合:111
  • 创建0的集合:00
  • 加入他们:11100
  • 显示所有排列:

enter image description here

答案 3 :(得分:-1)

以下是我将如何操作3,5。从字符串111开始。 5 - 3 = 2,所以总共加2个零。每个零a1b1c1d有四个可能的位置。 4 ^ 2表示16个可能的位置,第一个位置编码为0 - 3,第二个位置编码为(0 - 3)* 4.现在枚举0 - 15,并打印出结果组合。在这个方案中,前5个输出是:

00111, 01011, 01101, 01110, 01011

我们重复一遍。当您需要组合时,此机制会打印出排列。可能有一种方法可以枚举组合,但最简单的解决方案是只对您的结果编制索引,并确保不会两次返回相同的结果。