把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值和出现的概率。
解法一:基于递归求骰子点数。
1 /////////////////基于递归求骰子点数///////////////////////////////////////////////////////// 2 int g_MaxValue = 6 ;//骰子的点数个数 3 void Probability(int original , int current , int sum , int* pProbabilities)//original表示骰子个数,current表示剩余骰子的个数,sum表示当前和的一种情况,pProbabilities是存储相同和出现的次数。 4 { 5 if (current == 0) 6 { 7 pProbabilities[sum - original]++ ;//数组的下标就是当前和减去最小和的值,数组里存储的是当前和出现的次数。 8 } 9 else 10 { 11 for (int i = 1 ; i <= g_MaxValue ; i++ ) 12 { 13 Probability(original , current - 1 , sum + i , pProbabilities); 14 } 15 } 16 } 17 18 void Probability(int number , int* pProbabilities) 19 { 20 int sum = 0 ; 21 Probability(number , number , sum , pProbabilities); 22 } 23 24 void PrintProbability(int number) 25 { 26 if (number < 1) 27 { 28 return; 29 } 30 int MaxSum = number * g_MaxValue ;//最大的和 31 int size = MaxSum - number + 1 ;//和的可能情况数 32 int* pProbabilities = new int[size]; 33 for (int i = 0 ; i < size ; i++) 34 { 35 pProbabilities[i] = 0 ;//初始化为0 36 } 37 Probability(number , pProbabilities); 38 double total = pow((double)(g_MaxValue) , number);//和的组合情况 39 for (int i = 0 ; i < size ; i++) 40 { 41 double ratio = pProbabilities[i] / total ;//概率 42 cout<< i + number<<" : "<<pProbabilities[i] <<" : "<<ratio<<endl ; 43 } 44 45 }
原文:http://www.cnblogs.com/csxcode/p/3739620.html