问题描述:扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。
#include<iostream>
#include<vector>
using namespace std;
struct pairs {
int s;
double prob;
};
vector<pairs> dicesum(int n)
{
vector<pairs> result(5*n+1);
double**f = new double *[n + 1];//申请指针数组
for (int i = 0; i <= n; i++)
{
f[i] = new double[6 * n + 1];
}
for (int i = 0; i <= n; i++)//初始化
{
for (int j = 0; j <= 6 * n; j++)
f[i][j] = 0;
}
for (int i = 1; i <= 6; i++)
{
f[1][i] = 1.0 / 6;
}
for (int i = 2; i <= n; i++)//计算概率
{
for (int j = i; j <= 6 * n; j++)
{
for (int k = 1; k <= 6; k++)
{
if (j > k)
f[i][j] += f[i - 1][j - k];
}
f[i][j] = f[i][j] / 6;
}
}
for (int i = n; i <= 6 * n; i++)
{
result[i - n].s = i;
result[i - n].prob = f[n][i];
}
for (int i = 0; i <= n; i++)//删除动态指针
{
delete[]f[i];
}
delete[]f;
return result;
}
int main()
{
int a = 2;
vector<pairs> result = dicesum(a);
vector<pairs> ::iterator it = result.begin();
for (; it != result.end(); it++)
{
cout << (*it).s << "," << (*it).prob << endl;
}
system("pause");
return 0;
}