64,639
社区成员
发帖
与我相关
我的任务
分享
设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 "stdafx.h"
#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;
double **arr = new double*[n+1];
for(int i = 0; i < n+1; i++)
{
arr[i] = new double[high + 1]();
}
for (int i = 1; i <= high; i++)
{
arr[1][i] = PROBALITY;
}
for(int i = 2; i <= n; i++)
{
for(int j = low; j <= high; j++)
{
if (2 == j)
arr[i][j] = (arr[i-1][j-1] + arr[i-1][j-2]) / 6.0;
else if (3 == j)
arr[i][j] = (arr[i-1][j-1] + arr[i-1][j-2] + arr[i-1][j-3]) / 6.0;
else if(4 == 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(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] + 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;
if(i == j)
arr[i][j] = PROBALITY;
}
}
cout.setf(ios::fixed);
for(int i = low; i <= high; i++)
{
cout<<"the probality of "<<i<<" is "<<setprecision(4)<<arr[n][i]<<endl;
}
}
int main()
{
PrintProbality(1);
return 0;
}