n 个骰子的点数

2.n 个骰子的点数。
把n 个骰子扔在地上,所有骰子朝上一面的点数之和为S。
输入n,打印出S 的所有可能的值出现的概率。

打算用动态规划来求解的,

C/C++ code
    
    
    
    
设T(n,m)为n个骰子和为m的概率 含有递推式如下: T(n,m) = T(n - 1 ,m - 1 ) * 0.17 + T(n - 1 ,m - 2 ) * 0.17 + T(n - 1 ,m - 3 ) * 0.17 + T(n - 1 ,m - 4 ) * 0.17 + T(n - 1 ,m - 5 ) * 0.17 + T(n - 1 ,m - 6 ) * 0.17 可以用二维数组记录下就可以了,动态规划思想。


#include <cstdio> #include <iostream> #include <cmath> #include <iomanip> using namespace std; #define PROBALITY double(1)/double(6) void PrintProbality(int n) { int low = n; int high = 6 * n; int i,j; double **arr = new double*[n+1]; for(i = 0; i < n+1; i++) { arr[i] = new double[high + 1](); } for (i = 1; i <= 6; i++) { arr[1][i] = PROBALITY; } //for(i = 1;i <= n;i++) // for(j=1;j <= high;j++) // { // if(j < i || j > 6*i) // arr[i][j] = 0; // } for(i = 2; i <= n; i++) { for(j = i; j <= 6*i; j++) { if (2 == j) arr[i][j] = (arr[i-1][j-1]) / 6.0; else if (3 == j) arr[i][j] = (arr[i-1][j-1] + arr[i-1][j-2]) / 6.0; else if(4 == j) arr[i][j] = (arr[i-1][j-1] + arr[i-1][j-2] + arr[i-1][j-3]) / 6.0; else if(5 == j) arr[i][j] = (arr[i-1][j-1] + arr[i-1][j-2] + arr[i-1][j-3] + arr[i-1][j-4]) / 6.0; else if(6 == j) arr[i][j] = (arr[i-1][j-1] + arr[i-1][j-2] + arr[i-1][j-3] + arr[i-1][j-4] + arr[i-1][j-5])/6.0; else if(6 < j) arr[i][j] = (arr[i-1][j-1] + arr[i-1][j-2] + arr[i-1][j-3] + arr[i-1][j-4] + arr[i-1][j-5] + arr[i-1][j-6])/6.0; } } cout.setf(ios::fixed); for(i = low; i <= high; i++) { cout<<"the probality of "<<i<<" is "<<setprecision(4)<<arr[n][i]<<endl; } } int main() { PrintProbality(3); return 0; }

 

你可能感兴趣的:(n 个骰子的点数)