n个筛子的点数
题目:把n个筛子扔到地上,所有筛子朝上一面的点数之和为s,输入n,打印出s的所有可能的值出现的概率。
分析:
方法1:递归。
要求概率,那么我们首先只需要求出每个s出现的次数/(6^n)。怎么求s的次数呢?我们不妨把n个筛子分成2堆,一堆一个筛子,另一堆有n-1个筛子,第1堆筛子出现的情况有:1,2,3,4,...6.(所以在代码中用for),另一堆我们也把它分成2堆,一堆有1个筛子(也有1,2,3,4,5,6中情况),另一堆就有n-2个筛子。直到最后只剩下一个筛子,那么就不能分成两堆,也就停止了。这就是迭代的思想。好了,废话不多说,上代码:
int g_maxNumber = ; //筛子最大点数为6
void Problility(int number)
{
if(number<1)
return;
int maxAllNumbers = * number;
int length = maxAllNumbers - number; //数组长度
int *problility = new int[length]; //用来记录筛子和为多少的个数
//初始化每个s的概率都为0
for (int i = number; i < length; i++)
problility[i-number] = ;
findProbility(number, problility); //核心函数,用来计算每个sum的个数,number <=sum<=maxAllNumbers
//所有组合
int total = pow(g_maxNumber, );
//下面计算s为number 到maxAllNumbers 之间分别概率多少
for (int i = number; i <= maxAllNumbers; i++)
{
double ratio = (double)problility[i - number] / total;
printf("和为%d的概率为: %s", i, ratio);
}
}
void findProbility(int number,int *probilities) //number :筛子的个数,也代表点数最小的时候,probilities保存每个sum的个数
{
for (int i = ; i <= g_maxNumber; i++)
findProbility(number, number, i, probilities);
}
/* original 就是筛子的个数,current是当前筛子个数,每次递归current就会-1,sum将
每个筛子的点数累积加起来,pProbilities就是一个数组,记录筛子和为sum的概率 */
void findProbility(int original, int current, int sum, int *pProbilities)
{
//出口
if (current == )
pProbilities[sum - original]++; //之所以-original是因为数组的第0个元素=number开始的,original 就是筛子的个数number //递归:分成两堆,一堆一个筛子,另一堆剩余的筛子
for (int i = ; i <=g_maxNumber;i++)
findProbility(original, current - , sum + i, pProbilities);
}
方法2:
n个筛子的点数的更多相关文章
- 剑指offer面试题43:n个筛子的点数
题目描述: 把n个筛子扔在地上,所有筛子朝上的一面点数之和为s,输入n,打印出s的所有可能的值出线的概率. 书上给了两种解法,第一种递归的方法由于代码太乱,没有看懂=.= 第二种方法很巧妙,lz已经根 ...
- js中的投掷筛子的小游戏
代码 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 《A First Course in Probability》-chaper4-离散型随机变量-随机变量和或积的期望
基于随机变量一系列最基本的概念,我们便会开始探讨一些随机变量函数的期望.多个随机变量和的期望.多个随机变量乘积的期望. 这里我们就简单的讨论后两个期望. 这两个问题可以基于如下的一个现实模型: 同时掷 ...
- python-两个筛子数据可视化(直方图)
""" 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...
- python-模拟掷骰子,两个筛子数据可视化
""" 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...
- UVA 810 A Dicey Promblem 筛子难题 (暴力BFS+状态处理)
读懂题意以后还很容易做的, 和AbbottsRevenge类似加一个维度,筛子的形态,可以用上方的点数u和前面的点数f来表示,相对的面点数之和为7,可以预先存储u和f的对应右边的点数,点数转化就很容易 ...
- (Lineup the Dominoes筛子)三维状压
传送门 描述:\(一堆筛子,每个筛子两个面,上面有1-6之间的数字.后一个筛子与前一个筛子的接触面的点数必须相等.\) \(求,有多少种方案堆完筛子.(方案只关心筛子的位置,不关心是否翻转)\) \( ...
- 【编程题目】n 个骰子的点数
67.俩个闲玩娱乐(运算).2.n 个骰子的点数.把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n,打印出 S 的所有可能的值出现的概率. 思路:用递归把每个骰子的可能情况变量,记录 ...
- HDU-1466 计算直线的交点数 经典dp
1.HDU-1466 计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条 ...
随机推荐
- java、js的编码、解码
如果在地址栏挂载参数,特别是包含中文,往往要进行编码,取值时再解码,以下是java和js中编码.解码的各自方法. java: @Test public void test3() throws Unsu ...
- Matlab中sortrows函数解析
一.问题来源 返回检索到的数据(按相关度排序)在原始数据中的索引. 二.问题解析 x = [1 4 3 5; 1 3 2 6]:sortrows(x)其结果是按照row来排列,默认首先排第一列,1和1 ...
- 团体程序设计天梯赛-练习集L2-005. 集合相似度
L2-005. 集合相似度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定两个整数集合,它们的相似度定义为:Nc/Nt*1 ...
- 汇编Ring 3下实现 HOOK API
[文章标题]汇编ring3下实现HOOK API [文章作者]nohacks(非安全,hacker0058) [作者主页]hacker0058.ys168.com [文章出处]看雪论坛(bbs.ped ...
- hdu 4652 Dice 概率DP
思路: dp[i]表示当前在已经投掷出i个不相同/相同这个状态时期望还需要投掷多少次 对于第一种情况有: dp[0] = 1+dp[1] dp[1] = 1+((m-1)*dp[1]+dp[2])/m ...
- HeadFirst设计模式之状态模式
一. 1. 2.The State Pattern allows an object to alter its behavior when its internal state changes. Th ...
- MyBatis的动态SQL操作--插入
需求:向数据库中插入一条数据 //id,name,sal非空,三个字段都插入 insert into student(id,name,sal) values (?,?,?) //id,name非空,只 ...
- Windows 各种计时函数总结
本文对Windows平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的 5种方法.分为在标准C/C++下的二种time()及clock(),标准C/C++所以使用的time()及cloc ...
- Hadoop单机模式安装
一.实验环境说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: ...
- poj1823,3667
又来练线段树了…… poj1823题意很简单(明显的数据结构题),区间修改和统计最长连续空区间: 有了poj3468的基础,区间修改不是什么问题了,重点是求最长连续空区间:(弱弱的我纠结了好久) 在每 ...