把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]+" ");
}