打靶的问题,打了10次,共计90环,每次的取值范围是0-10环,求可能的组合数。 public class Test { public Test(int[] r){ result=r; } public static int count=0; int[] result; /** * num 打靶的次数 * sum 总环数 */ public void func(int num,int sum){ if (num==0 && sum==0){ for (int x=0;x<result.length;x++) System.out.print(result[x]+","); System.out.println(""); count++; }else{ if (num*10<sum || sum<0) return;//边界值 for (int x=0;x<=10;x++){ if(num<result.length && x<result[num]) {continue;}//去掉此行就是不排重的排列数 result[num-1]=x; func(num-1,sum-x);//还需要打多少枪,还需要打共多少环 } } } public static void main(String[] args) { //注释掉的这段是笨办法,n个循环实现的 /*int num=0; for(int a=10;a>=20/3;a--){ for(int b=a;b>=0;b--){ for(int c=b;c>=0;c--){ if(a+b+c==20){ System.out.println(a + "," + b + "," + c); num++; break; } } } } System.out.println(num);*/ new Test(new int[3]).func(3,20); System.out.print(new Test(new int[3]).count); } }