面试题43:n个骰子的点数
2016-07-20 16:58
316 查看
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s所有可能的值出现的概率。
该题是典型的动态规划问题。n个骰子它的和显然和前面n-1个骰子的状态有关。可以一步步划分来求,一般考虑设个数祖,一个记录当前是第多少个骰子,一个记录总和多少,还要记录总和的概率,因此此处考虑设个二维数组,p[m]
,m表示当前骰子数值,n代表当前点数。p[m]
代表出现的次数或者概率。但是此次看书上用的只是一个行为2的数组,大大减小了内存消耗。很经典,应该学习。代码如下:
#include "stdafx.h"
#include <algorithm>
const int g_max = 6;
void Probility(int num)
{
if(num < 0)
return;
int len = g_max * num;
int *p[2];
p[0] = new int[len + 1];
p[1] = new int[len + 1];
for (int i = 0; i < len + 1; i++)
{
p[0][i] = 0;
p[1][i] = 0;
}
int flag = 0;
for (int i = 1; i <= g_max; i++)
{
p[flag][i] = 1;
}
for (int k = 2; k <= num; k++)
{
for (int i = 0; i < k; i++)
{
p[1 - flag][i] = 0;
}
for (int i = k; i <= g_max *k; i++)
{
p[1 - flag][i] = 0;
for (int j = 1; (j < i) && (j <= g_max); j++)
{
p[1 - flag][i] += p[flag][i - j];
}
}
flag = 1 - flag;
}
double total = pow((double)g_max, num);
for (int i = num; i <= g_max * num; i++)
{
double ratio = (double)p[flag][i] / total;
printf("%d: %e\n", i, ratio);
}
delete[] p[0];
delete[] p[1];
}
int _tmain(int argc, _TCHAR* argv[])
{
Probility(4);
return 0;
}
该题是典型的动态规划问题。n个骰子它的和显然和前面n-1个骰子的状态有关。可以一步步划分来求,一般考虑设个数祖,一个记录当前是第多少个骰子,一个记录总和多少,还要记录总和的概率,因此此处考虑设个二维数组,p[m]
,m表示当前骰子数值,n代表当前点数。p[m]
代表出现的次数或者概率。但是此次看书上用的只是一个行为2的数组,大大减小了内存消耗。很经典,应该学习。代码如下:
#include "stdafx.h"
#include <algorithm>
const int g_max = 6;
void Probility(int num)
{
if(num < 0)
return;
int len = g_max * num;
int *p[2];
p[0] = new int[len + 1];
p[1] = new int[len + 1];
for (int i = 0; i < len + 1; i++)
{
p[0][i] = 0;
p[1][i] = 0;
}
int flag = 0;
for (int i = 1; i <= g_max; i++)
{
p[flag][i] = 1;
}
for (int k = 2; k <= num; k++)
{
for (int i = 0; i < k; i++)
{
p[1 - flag][i] = 0;
}
for (int i = k; i <= g_max *k; i++)
{
p[1 - flag][i] = 0;
for (int j = 1; (j < i) && (j <= g_max); j++)
{
p[1 - flag][i] += p[flag][i - j];
}
}
flag = 1 - flag;
}
double total = pow((double)g_max, num);
for (int i = num; i <= g_max * num; i++)
{
double ratio = (double)p[flag][i] / total;
printf("%d: %e\n", i, ratio);
}
delete[] p[0];
delete[] p[1];
}
int _tmain(int argc, _TCHAR* argv[])
{
Probility(4);
return 0;
}
相关文章推荐
- Java进阶之路——从初级程序员到架构师,从小工到专家
- 2016校招百度美团360机器学习岗面试经历
- 程序员学习交流网站
- Android 面试题不含答案
- 经典算法面试题目-翻转一个C风格的字符串(1.2)
- 经典算法面试题目-翻转一个C风格的字符串(1.2)
- 腾讯 美团 百度 网易游戏 2015校园招聘南京笔试面试之总结分析
- 整一张图片记录不同游戏职业,好玩儿~
- 【那些年遇到过的面试题】pthread_cond
- 黑马程序员: PHP零基础土木研究生,如何做到毕业年薪20万?
- 程序员的八个级别-拿来分享下
- Android面试题
- 面试题48:不能被继承的类
- 《Web全栈工程师的自我修养》读后感
- 面试题47:不用+、-、×、÷做加法
- 面试知识
- 面试题46:求1+2+ …… +n
- 老龄程序员的心声
- 【转】这些编程语言程序员工资最高!Java才第四
- Java工程师面试题