求助啊,急!

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

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

设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;
}

...全文
76 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxsong_04 2011-05-31
  • 打赏
  • 举报
回复
这个不用动态规划 用记忆化搜索 开个大数组1到6n 记录每种可能出现的次数 然后依次除总次数
hacker1019 2011-05-30
  • 打赏
  • 举报
回复
else 怎么不结束?
longbaoer_1215 2011-05-30
  • 打赏
  • 举报
回复
1/6 =0.16666666.......
JamOfCode 2011-05-30
  • 打赏
  • 举报
回复
0.17是什么

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧