如果你有x个对象(可以用1表示)放在y槽中(空槽可以表示为0),写一个函数打印对象可以放入的所有可能方式插槽。该方法将输入对象的数量和总槽数。
例如,possibleCombinations(3,5)应该打印3个对象可以放在5个插槽中的方式:
11100,11010,11001,10110,10101,10011,01110,01101,01011,00111
我认为递归是一种选择,但我不确定如何设置它以便它适用于任意数量的对象。任何帮助将不胜感激!
答案 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}]]]
并获得正确答案。
这个答案的步骤是:
答案 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
我们重复一遍。当您需要组合时,此机制会打印出排列。可能有一种方法可以枚举组合,但最简单的解决方案是只对您的结果编制索引,并确保不会两次返回相同的结果。