lintcode 20 掷骰子求和

问题描述:扔 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;
}

猜你喜欢

转载自blog.csdn.net/fuck_you_sb/article/details/81216498