(剑指Offer)面试题43:n个骰子的点数
题目:
把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
思路:
s可能出现的值的范围为:n--6*n
1、全排列
回溯法枚举n个骰子(6面)的全排列,然后计算每一次排列所有值的和,并统计该和的出现的次数,除以6^n(全排列的全部可能性),即为概率。(这里就不列出代码)
2、递归思想
通过递归的思想将n个骰子的点数累加。
要求出n个骰子的点数和,可以先求出前n-1个骰子的点数和,然后加上第n个骰子的点数;
递归结束条件:n=1,此时某个点数和出现的次数+1;
3、动态规划思想
假设f(m,n)表示投第m个骰子时,点数之和n出现的次数,投第m个骰子时的点数之和只与投第m-1个骰子时有关。
递归方程:f(m,n)=f(m-1,n-1)+f(m-1,n-2)+f(m-1,n-3)+f(m-1,n-4)+f(m-1,n-5)+f(m-1,n-6),表示本轮点数和为n出现次数等于上一轮点数和为n-1,n-2,n-3,n-4,n-5,n-6出现的次数之和。
初始条件:第一轮的f(1),f(2),f(3),f(4),f(5),f(6)均等于1.
代码:
1、递归方法
#include <iostream>
#include <math.h> using namespace std; int g_maxValue=6; void Probability(int original,int index,int curSum,int* pProbability){
if(index==0){
pProbability[curSum-original]+=1;
return;
}
for(int i=1;i<=6;i++)
Probability(original,index-1,curSum+i,pProbability);
} void PrintProbability(int n){
if(n<1)
return;
int maxSum=n*g_maxValue;
int* pProbability=new int[maxSum-n+1];
for(int i=n;i<=maxSum;i++)
pProbability[i-n]=0;
int curSum=0;
Probability(n,n,curSum,pProbability); int total=pow((double)g_maxValue,n);
double prob=0;
for(int i=n;i<=maxSum;i++){
double ratio=(double)pProbability[i-n]/total;
prob+=ratio;
cout<<i<<" "<<ratio<<" "<<endl;
}
cout<<prob<<endl;
cout<<endl; delete[] pProbability;
} int main()
{
int n=5;
PrintProbability(n);
return 0;
}
2、动态规划
#include <iostream>
#include <math.h> using namespace std; int g_maxValue=6;
void PrintProbability(int n){
if(n<1)
return; int* pProbability[2];
pProbability[0]=new int[g_maxValue*n+1];
pProbability[1]=new int[g_maxValue*n+1]; for(int i=0;i<=g_maxValue*n;i++){
pProbability[0][i]=0;
pProbability[1][i]=0;
} int flag=0;
for(int i=1;i<=g_maxValue;i++)
pProbability[flag][i]=1; for(int k=2;k<=n;k++){
for(int i=0;i<k;i++)
pProbability[1-flag][i]=0;
for(int i=k;i<=g_maxValue*k;i++){
pProbability[1-flag][i]=0;
for(int j=1;j<=i && j<=g_maxValue;j++)
pProbability[1-flag][i]+=pProbability[flag][i-j];
}
flag=1-flag;
} int total=pow((double)g_maxValue,n);
double prob=0;
for(int i=0;i<=g_maxValue*n;i++){
//cout<<pProbability[flag][i]<<endl;
double ratio=(double)pProbability[flag][i]/total;
prob+=ratio;
cout<<i<<" "<<ratio<<" "<<endl;
}
cout<<prob<<endl;
cout<<endl; delete[] pProbability[0];
delete[] pProbability[1];
} int main()
{
int n=5;
PrintProbability(n);
return 0;
}
(剑指Offer)面试题43:n个骰子的点数的更多相关文章
- 剑指offer 面试题43. 1~n整数中1出现的次数
leetcode上也见过一样的题,当时不会做 看了一下解法是纯数学解法就没看,结果剑指offer上也出现了这道题,那还是认真看下吧 对于数字abcde,如果第一位是1,比如12345,即计算f(123 ...
- 剑指offer面试题43:n个筛子的点数
题目描述: 把n个筛子扔在地上,所有筛子朝上的一面点数之和为s,输入n,打印出s的所有可能的值出线的概率. 书上给了两种解法,第一种递归的方法由于代码太乱,没有看懂=.= 第二种方法很巧妙,lz已经根 ...
- 剑指Offer面试题43(Java版):n个骰子的点数
题目:把n个骰子仍在地上.全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率. 解法一:基于递归求骰子的点数,时间效率不够高 如今我们考虑怎样统计每个点数出现的次数. 要向求出n ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
随机推荐
- 利用linux判断elf文件是64位还是32位
readelf 命令,参数为-h 例如 文件名为python >>>readelf -h python 得到的是ELF Header中的项Magic 第五个数 02时为64位,01时 ...
- Java 接口和抽象类--缺省模式
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...
- 使用webgl(three.js)创建3D机房,3D机房微模块详细介绍(升级版二)
序: 上节课已经详细描述了普通机房的实现过程,文章地址(https://www.cnblogs.com/yeyunfei/p/10473021.html) 紧接着上节课的内容 我们这节可来详细讲解机房 ...
- Elasticsearch 删除索引下的所有数据
下面是head中操作的截图 #清空索引 POST quality_control/my_type/_delete_by_query?refresh&slices=5&pretty { ...
- django添加REST_FRAMEWORK 接口浏览
1.安装rest_framework pip install djangorestframework 2.配置rest_framework ## 将rest_framework加入项目app列表 I ...
- FastReport.Net使用:[28]数据合并
基础数据 1.拖动数据源中的数据列到报表设计器中,获得一张简单的报表. 2.下面使用两种方法将期中考试和期末考试的成绩合并到一行显示 合并数据(分组方法) 1.按学生名字和科目来进行分组,成绩文本框咱 ...
- POJ poj 2155 Matrix
题目链接[http://poj.org/problem?id=2155] /* poj 2155 Matrix 题意:矩阵加减,单点求和 二维线段树,矩阵加减,单点求和. */ using names ...
- 【BZOJ 2946】 2946: [Poi2000]公共串 (SAM)
2946: [Poi2000]公共串 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1063 Solved: 469 Description ...
- 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)
3308: 九月的咖啡店 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 244 Solved: 86 Description 深绘里在九份开了一家咖 ...
- git fetch, git pull 以及 FETCH_HEAD
git push. 这个很简单, 其实和后面的差不多, 这里就不讲了. 唯一需要注意的地方是: git push origin :branch2, 表示将一个内容为空的同名分支推送到远程的分支.(说白 ...