面试题 43 n 个骰子的点数】的更多相关文章

引言:写这篇文章的初衷只是想做个笔记,因为这道题代码量有点大,有点抽象,而书上并没有详细的注释.为了加深印象和便于下次复习,做个记录. 原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入n,打印出s所有可能的值出现的概率.(每个骰子6个面,点数从1到6) 解法一:基于递归,时间效率不高 递归的思想一般是分而治之,把n个骰子分为第一个和剩下的n-1个.先计算第一个骰子每个点数出现的次数,再计算剩余n-1个骰子出现的点数之和.求n-1个骰子的点数之的方法和前面讲的一样,即再次把n-1个…
; void printfProbability(int number) { ) return; ]; p[] = ]; p[] = ]; memset(p[], , )); memset(p[], , )); ; ; i<= g_maxValue ; ++i) p[flag][i] = ; ; k <= g_maxValue; ++k){ ; j< k; ++j) p[-falg][j] = ; for(int i = k; i <= g_maxValue * k ;++i){…
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释.而n个骰子的问题实质就是一个动态规划问题,所以文本主要从动态规划的角度来求解这个问题.首先该问题具备DP的两个特征:最优子结构性质和子问题的重叠性.具体的表现在:(1)n个骰子的点数依赖于n-1个骰子的点数,相当于在n-1个骰子点数的基础上再进行投掷.(2)求父问题的同时,需要多次利用子问题.由此定义状态转…
问题描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率. 示例 1: 输入: 1 输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667] 示例 2: 输入: 2 输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0…
第一种思路是,每一个骰子的点数从最小到最大,如果为1-6,那么全部的骰子从最小1開始,我们如果一种从左向右的排列,右边的最低,索引从最低開始,推断和的情况. def setTo1(dices, start, end): for i in range(start, end): dices[i] = 1 def probability(n, s, dmax = 6, dmin = 1): if s < n * dmin or s > n * dmax : return 0 dices = [1]…
题目: 把n个骰子仍在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 思路: s可能出现的值的范围为:n--6*n 1.全排列 回溯法枚举n个骰子(6面)的全排列,然后计算每一次排列所有值的和,并统计该和的出现的次数,除以6^n(全排列的全部可能性),即为概率.(这里就不列出代码) 2.递归思想 通过递归的思想将n个骰子的点数累加. 要求出n个骰子的点数和,可以先求出前n-1个骰子的点数和,然后加上第n个骰子的点数: 递归结束条件:n=1,此时某个点数和出现的次…
题目:把n个骰子仍在地上.全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率. 解法一:基于递归求骰子的点数,时间效率不够高 如今我们考虑怎样统计每个点数出现的次数. 要向求出n个骰子的点数和.能够先把n个骰子分为两堆:第一堆仅仅有一个.还有一个有n-1个.单独的那一个有可能出现从1到6的点数. 我们须要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和. 接下来把剩下的n-1个骰子还是分成两堆,第一堆仅仅有一个.第二堆有n-2个. 我们把上一轮哪个单独骰子的点数和这…
[面试题043]n个骰子的点数 题目:     把n个骰子扔在地上,所有骰子朝上一面的点数之和为s, 输入n,打印出s的所有可能的值出现的概率.   n个骰子的总点数,最小为n,最大为6n,根据排列组合的知识,那个骰子,所有点数的排列数为6^n. 我们先统计每一个点数出现的次数,然后把每一个点数出现的次数除以6^n,就能求出每个点数出现的概率.   思路一:     基于递归求骰子点数,时间效率不够高. 先把骰子分成两堆,第一堆只有一个,第二堆有n-1个, 单独的那一个可能出现1到6的点数,我们…
题目:把n个骰子扔在地上,全部骰子朝上一面的点数之和为s.输入n.打印出s 的全部可能的值出现的概率. 解题思路 解法一:基于通归求解,时间效率不够高. 先把n个骰子分为两堆:第一堆仅仅有一个.还有一个有n- 1 个.单独的那一个有可能出现从1 到6 的点数. 我们须要计算从1 到6 的每一种点数和剩下的n-1 个骰子来计算点数和.接下来把剩下的n-1个骰子还是分成两堆,第一堆仅仅有一个, 第二堆有n-2 个.我们把上一轮那个单独骰子的点数和这一轮单独骰子的点数相加. 再和剩下的n-2 个骰子来…
算法分析: 算法1.基于递归求色子点数,时间效率不高 现在我们考虑如何统计每一个点数出现的次数.要向求出n个骰子的点数和,可以先把n个骰子分为两堆:第一堆只有一个,另一个有n-1个.单独的那一个有可能出现从1到6的点数.我们需要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和.接下来把剩下的n-1个骰子还是分成两堆,第一堆只有一个,第二堆有n-2个.我们把上一轮哪个单独骰子的点数和这一轮单独骰子的点数相加,再和n-2个骰子来计算点数和.分析到这里,我们不难发现这是一种递归的思路,递归结束…