题目:

把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个骰子的点数的更多相关文章

  1. 剑指offer 面试题43. 1~n整数中1出现的次数

    leetcode上也见过一样的题,当时不会做 看了一下解法是纯数学解法就没看,结果剑指offer上也出现了这道题,那还是认真看下吧 对于数字abcde,如果第一位是1,比如12345,即计算f(123 ...

  2. 剑指offer面试题43:n个筛子的点数

    题目描述: 把n个筛子扔在地上,所有筛子朝上的一面点数之和为s,输入n,打印出s的所有可能的值出线的概率. 书上给了两种解法,第一种递归的方法由于代码太乱,没有看懂=.= 第二种方法很巧妙,lz已经根 ...

  3. 剑指Offer面试题43(Java版):n个骰子的点数

    题目:把n个骰子仍在地上.全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率. 解法一:基于递归求骰子的点数,时间效率不够高 如今我们考虑怎样统计每个点数出现的次数. 要向求出n ...

  4. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  5. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  6. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  7. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  8. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  9. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  10. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

随机推荐

  1. Bzoj2152/洛谷P2634 聪聪可可(点分治)

    题面 Bzoj 洛谷 题解 点分治套路走一波,考虑\(calc\)函数怎么写,存一下每条路径在\(\%3\)意义下的路径总数,假设为\(tot[i]\)即\(\equiv i(mod\ 3)\),这时 ...

  2. 详细理解Java虚拟机的运行过程

    基本概述: Java虚拟机简称JVM,是JRE中的一部分,也是Java程序运行的最关键的部分.完整的Java运行流程大致包括编译.java文件形成.class文件,然后根据.class文件的内容进行一 ...

  3. Python 2.7.x 和 3.x 版本的语法区别

    <__future__模块> Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容.如果你希望在 ...

  4. FastReport.Net使用:[38]关系的使用

    打印所有成绩 1. 数据源准备 接下来我们需要打印学生成绩,而成绩表中无姓名,我们通过建立Realtion关系来打印数据. 2. 创建Relation关系 在数据视图上的动作下拉菜单中选择“新建关系” ...

  5. 【BZOJ 2916】 2916: [Poi1997]Monochromatic Triangles (容斥)

    2916: [Poi1997]Monochromatic Triangles Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 310  Solved: 1 ...

  6. codevs1081 线段树练习 2<区间修改>

    1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master   题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有 ...

  7. NOIP2017 D2T3列队

    这题我改了三天,考场上部分分暴力拿了50,考完试发现与正解很接近只是没写出来. 对于每一行和最后一列建n+1颗线段树,维护前缀和. 复杂度qlogn 假如你移动一个坐标为(x,y)的人,你要将第x行线 ...

  8. GeoIP的使用

    GeoIP介绍: 什么是GepIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息.这里面的技术不算难题,关键在于有个精准 的数据库.有了准确的数据源 ...

  9. Makefile-filter和filter-out

    filter:代表中目标串中找出符合匹配规则的. 示例: sources := foo.c bar.c baz.s ugh.h foo: $(sources) cc $(filter %.c %.s, ...

  10. bzoj 3669: [Noi2014]魔法森林 -- 动点spfa

    3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MB 动点spfa Description 为了得到书法大家的真传,小E同学下定决心 ...