面试题六十:n个骰子的点数
把n个骰子扔在地上,求出现和为s的概率
可得n<=s<=6n
方法:定义6n-n+1长度的数组,然后对所有可能出现的组合进行计算,把结果进行计数存进数组;递归
方法二:动态规划,大问题小化:考虑使用两个数组存储点子的总数之和出现的次数,每增一个骰子,是前几个数组值的和,因为6个面,所以前n的前6的和
void Print_F1(int number) { if(number<1) return; int maxVaule=6; int [][]array=new int [2][number*maxVaule+1]; int flag=0; //第一颗骰子 for(int i=1;i<=maxVaule;i++) array[flag][i]=1; for(int k=2;k<=number;k++) { //本项数组归零, for(int i=0;i<=k;++i) array[1-flag][i]=0; for(int i=k;i<=maxVaule*k;i++) { array[1-flag][i]=0; //n=另一个数组n项前6的和,j<=i防止前面少于6项而出错 //每加一个骰子,则可选范围(1-6);没有0;所以不需要加本身 for(int j=1;j<=i&&j<=maxVaule;j++) array[1-flag][i]+=array[flag][i-j]; } flag=1-flag; } //如果求概率,那么需要进行double运算 //总数是maxVaule的number次方 for(int i=number;i<=maxVaule*number;i++) System.out.print(array[flag][i]+" "); }
浪波激泥