前提条件:0&lt; k <= n
您的方法需要返回k个组可以由n个不同项组成的方式的数量。例如,有3种方法可以形成3个项目中的2组:
1.(a)(b,c)2.(b)(a,c)3.(c)(a,b)
并且有4种方法可以从4个项目中形成3组:
1.(a)(b,c)(d)2.(a)(b)(c,d)3。(a)(c)(b,d)
4.(a,b)(c)(d)5.(b)(a,c)(d)6.(b)(c)(a,d)
到目前为止我已经
了 public static int groups (int n, int k){
if(n==k){
return n;
}else if(n>1 && k==1){
return 1;
}else return n*groups(n-1, k-1);
}
我甚至不知道在哪里递归。我认为无法将其分解为较小的子问题,因为一旦你开始计算可能性两次。任何帮助将非常感激。
答案 0 :(得分:0)
你写道:
我认为无法将其分解为较小的子问题,因为一旦你开始计算可能性两次。
事实并非如此。创建第一个组后,第一个组中的项目不再位于候选项目集中,并且子问题将计算剩余项目的所有可能分组 - 这绝非巧合与原始问题相同(计算一组项目的所有可能分组)。
那么,你的问题归结为必须计算单个组中所有可能的项目排列(例如a,ab,ac,bc,abc),然后对于每个项目,与其余项目类似地进行。
一旦您能够确定具有N个可用对象的单个组的排列数,最终结果就是该数字加上对于每个排列的数量加上不包括已经存在的组的排列数。分组项目(N减去组大小)。依此类推,直到达到基本情况为止,即0项的分组数为0。
如果你可以确定如何找到N个对象的排列数(其中排列不必包括每个对象),那么你已经解决了这个问题。