算法题——n个骰子的问题
2016-03-11 21:57
351 查看
要求:n个骰子抛出后的正面朝上的点数的和在所有情况中出现的概率
分析:刚刚拿到这个题的时候觉得自己一眼能看出有哪些情况,可是当骰子增加的时候却发现很难着手,怎么解决确实很棘手。仔细分析的话很容易找到一种便于理解的方法,后面的骰子的点数依靠前面的骰子的点数,可以看出后面出现的骰子和为n的情况,是由前面骰子和为(n-1),(n-2),(n-3),(n-4),(n-5),(n-6)这些情况构成的。可以得出如下公式:
f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)+f(n-6)
最终我们可以写出代码了。
分析:刚刚拿到这个题的时候觉得自己一眼能看出有哪些情况,可是当骰子增加的时候却发现很难着手,怎么解决确实很棘手。仔细分析的话很容易找到一种便于理解的方法,后面的骰子的点数依靠前面的骰子的点数,可以看出后面出现的骰子和为n的情况,是由前面骰子和为(n-1),(n-2),(n-3),(n-4),(n-5),(n-6)这些情况构成的。可以得出如下公式:
f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)+f(n-6)
最终我们可以写出代码了。
#include <iostream> using namespace std; int maxValue = 6; //骰子六个面中的最大值 void ProbabilityOfN(int number) { if (number < 0) { return; } int *probali[2]; probali[0] = new int[number*maxValue+1]; probali[1] = new int[number*maxValue+1]; memset(probali[0], 0, sizeof(int)*(number*maxValue + 1)); memset(probali[1], 0, sizeof(int)*(number*maxValue + 1)); for (int i = 1; i <= maxValue; ++i) { probali[0][i] = 1; } for (int i = 2; i <= number; ++i) { for (int j = i; j <= i*maxValue; ++j) //2-12 { for (int v = 1; v <= maxValue; ++v) { if (j - v > 0 && probali[0][j - v] > 0) { probali[1][j]+=probali[0][j-v]; } } } memset(probali[0], 0, sizeof(int)*number*maxValue); int * tmp = probali[0]; probali[0] = probali[1]; probali[1] = tmp; } int totalTimes = pow(double(maxValue), number); for (int i = 0; i < number*maxValue + 1; ++i) { printf("%d:%6f\n",i,double(probali[0][i]) / double(totalTimes)); } } int main() { int number = 0; cin >> number; ProbabilityOfN(number); return 0; }
相关文章推荐
- Qml实现对鼠标和键盘事件的简单处理
- [置顶] Android第三方库学习清单
- android launchmode
- java笔记-10
- 改善视疲劳,句好眼镜验光师建议多吃水果,IT大佬们更应注意
- 关于Android app的launcher图标更换后,仍然显示默认的ic_launcher图标的解决方法
- 02-百思不得姐(第二天)
- java中初始化与构造器
- Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算(转)
- CSS 中 Font-Family 中英文对照表
- oracle完整卸载
- java笔记-9
- Unity插件 DOTween基础
- CodeForces-630 F. Selection of Personnel【排列组合】
- 实现用画笔画出一个带有渐变效果的线条
- TCP协议中的SO_LINGER选项
- SQLite清空表并将自增列归零
- 最全SpringMVC具体演示样例实战教程
- 使用Python保存屏幕截图(不使用PIL)
- java练习 - 字符串反转