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

打印y插槽中x对象的所有组合(Java),java,combinations,Java,Combinations,如果有x个对象可以用1表示,这些1将被放置在y插槽中。空插槽可以表示为0,请编写一个函数,打印对象可以放置在插槽中的所有可能方式。该方法将对象数和总插槽数作为输入 例如,possibleCombinations3,5应打印3个对象在5个插槽中的放置方式: 11100、11010、11001、10110、10101、10011、01110、01101、01011、00111 我认为递归是一种选择,但我不确定如何设置它,使其适用于任意数量的对象。任何帮助都将不胜感激 这里有一些伪代码,显然我没有使用

如果有x个对象可以用1表示,这些1将被放置在y插槽中。空插槽可以表示为0,请编写一个函数,打印对象可以放置在插槽中的所有可能方式。该方法将对象数和总插槽数作为输入

例如,possibleCombinations3,5应打印3个对象在5个插槽中的放置方式:

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


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

这里有一些伪代码,显然我没有使用很好的数据结构。但如果可能的话,您可以查看每个调用,检查每个项目是否包括在内,并从那里继续。这是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)};

这是一些伪代码,显然我没有使用很好的数据结构。但如果可能的话,您可以查看每个调用,检查每个项目是否包括在内,并从那里继续。这是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)};

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

00111, 01011, 01101, 01110, 01011

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

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

00111, 01011, 01101, 01110, 01011

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

以下是一些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的用户


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

以下是一些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的用户


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

这提醒我,您可以在处搜索置换[Join[Table[1,{3}],Table[0,{5-3}]],并获得正确答案

这个答案的步骤是:

创建1的集合:111 创建0的集合:00 加入他们:11100 显示所有排列:
这提醒我,您可以在搜索置换[Join[Table[1,{3}],Table[0,{5-3}]],然后得到正确的答案

这个答案的步骤是:

创建1的集合:111 创建0的集合:00 加入他们:11100 显示所有排列:
伟大的我正要发布类似的东西:。值得补充的是,它直接来自计算组合的基本公式great!我正要发布类似的东西:。值得补充的是,它直接来自计算组合的基本公式