描述:
把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。
转移方程:
k表示骰子个数,n表示k个骰子的点数和
| =F(k-1, n-6) + F(k-1, n-5) + F(k-1, n-4) + F(k-1, n-3) +F(k-1, n-2) + F(k-1, n-1) 对于 k > 0,k <= n <= 6*k
F(k, n) = |
| = 0 对于 n < kor n > 6*k
初始化k=1,F(1,1)=F(1,2)=F(1,3)=F(1,4)=F(1,5)=F(1,6)=1
代码:
constint FACE_NUM = 6;
voidPrintSumProbabilityOfDices(int number)
{
// number超过20的话,会导致概率无法用double表示,因为double能表示的精度只有15~16位有效数字
if(number > 20)
{
cout << "error\n";
}
double pro[FACE_NUM * 20 + 1] = {1, 0};
int i, j, k;
for(i = 1; i <= number; i++)
{
for(j = FACE_NUM * i; j >= i;j--)
{
pro[j] = 0;
for(k = 1; k <= 6&& j >= k; k++)
{
pro[j]+= pro[j - k] / 6;
}
}
for(j = i - 1; j >= 0; j--)
{
pro[j] = 0;
}
}
double dj;
for(i = number, dj = 0; i <= FACE_NUM *number; i++)
{
cout << "number: "<< i << " probability:" << pro[i] << endl;
dj += pro[i];
}
cout << dj << endl;
}
intmain(int argc, char *argv[])
{
int n;
cin >> n;
PrintSumProbabilityOfDices(n);
}