题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率;显然,最小的值为n,最大的值为6*n,n~6n之间的整数都会出现,一共有6^n种组合,只要统计每个点数出现的次数即可。
比如有n个骰子,将他们分为两份,(1,n-1),一个骰子有6种方式{1,2,3,4,5,6} ,则可能出现的点数{1,2,3,4,5,6}+sum(n-1);
将剩下的骰子再分成(1,n-2),这个组合可能出现的点数{1,2,3,4,5,6}+sum(n-2),……最后分成(1,0)的组合,此时结束,只有{1,2,3,4,5,6}几种情况;
中间过程我们需要一个数组来保存可能出现的点数pro[6*n+1];
根据以上的分析,可以写出如下的代码:
void Counting(int current,int tempSum,int Probabilities[]) { if(current==0) Probabilities[tempSum]++; else { for(int i=1;i<=6;i++) { int sum=i+tempSum; Counting(current-1,sum,Probabilities); } } }
函数调用Counting(3,0,Probabilities);