待字闺中之n个色子之和分析

n个色子,每个色子m面,每一面的值分别是1-m。你将n个色子同时抛,落地后将所有朝上面的数字加起来,记为sum。给定一个数字x,如果sum>x,则你赢。给定n,m,x,求你赢的概率。

  • 1<=n<=100
  • 1<=m<=10
  • m<=x< n*m

分析

这个题目的描述,是将具体的问题一般化了。掌握了,这个问题的分析,就可以对这类问题通吃。一个具体的情况是什么呢?两个色子,每个色子六面,同时抛,求朝上数字和大于某一个值的概率。这个情况比较简单,两个色子同时抛,一共36种情况,注意这里有的和是相同的。此时,最少可以通过穷举的方法,得到答案。但是本题中的意思,显然是无法通过穷举呢?那该如何分析呢?

n个色子,每个色子m面。则一共有m^n中情况(类比上面分析的36种情况)。在这些里面,有多少个和是大于x的呢?假设,f(n,x)表示n个色子,所有朝上的数字和是x的情况数量。对于某一个色子,每一面朝上的概率是1/m。假设这个色子的k面朝上,1<=k<=m,则f(n,x) = sum{f(n - 1, x - k)} 1<=k<=m。递归的终止条件是,当只有一个色子的时候,f(1,k) = 1, 1<=k<=m,其他都是0

则最终的概率为(f(n, x + 1) + … + f(n, m*n)) / m^n。每一个大于x的和的可能情况数量之和除以总的情况数量。

代码如下:

double NDiceWithMSide(int n,int m,int x)//n个色子,m个面,求和大于x的概率
{
	int i,j,k,MaxPoint = n*m,SumOfAll = pow(m,n);
	int** f = new int* [n+1];
	for(i=0;i<=n;i++)
	{
		f[i] = new int[MaxPoint+1];
	}
	for(j = 1; j<=m;j++)f[1][j] = 1;//初始化一个色子
	for(i = 2;i <= n;i++)
	{
		for(j = i;j <= i*m;j++)
		{
			f[i][j] = 0;
			for(k=1;k<=m && k<j;k++)
			{
				f[i][j] += f[i-1][j-k];//<span style="color: rgb(51, 51, 51); font-family: Verdana, Arial, Tahoma, Helvetica, Georgia, sans-serif, STXihei, 华文黑体, Hei, 'Hiragino Kaku Gothic Pro', SimSun; line-height: 27.19999885559082px;">f(n,x) = sum{f(n - 1, x - k)} </span>
			}
		}
	}
	int sum  = 0;
	for(i=x+1;i<= MaxPoint;i++)
	{
		sum  += f[n][i];
	}
	for(i=0;i<=n;i++)delete[] f[i];
	delete[] f;
	return (double)sum / SumOfAll;
}

如有问题,请指正,谢谢

待字闺中之n个色子之和分析,布布扣,bubuko.com

时间: 2024-10-14 18:19:06

待字闺中之n个色子之和分析的相关文章

计算数组的最大子序列之和

问题描述: 计算一个给定数组的最大子序列之和 分析: 有三种方法: 1,扫描3遍,可以计算所有的子序列之和,但是复杂度为N^3. 2,扫描2遍,计算以任意元素开始的和,如果大于当前的最大值则将最大值付给它,复杂度为N^2. 3,扫描一遍,计算任意元素开始的值,如果小于零则清零,否则继续往后加. 代码实现: package c02; /**  * @project: DataStructureAndAlgorithmAnalysis  * @filename: MaxSubSum  * @vers

ural 1217. Unlucky Tickets

1217. Unlucky Tickets Time limit: 1.0 secondMemory limit: 64 MB Strange people live in Moscow! Each time in the bus, getting a ticket with a 6-digit number, they try to sum up the first half of digits and the last half of digits. If these two sums ar

NOIP1998普及组解题报告

三连击 分析:模拟大水题.打表也行.注意输出顺序即可. #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=10; bool book[maxn]; int main(){ for(int i=1;i<=9;++i){ for(int j=1;j<=9;++j){ for(int k=1;k<=9;++k){ if(i!

HDU 3336 Count the string (基础KMP)

It is well known that AekdyCoin is good at string problems as well as number theory problems. When given a string s, we can write down all the non-empty prefixes of this string. For example: s: "abab" The prefixes are: "a", "ab&qu

Java基础:循环控制语句

有三种:for,while,do...while for循环语句: A:格式 for(初始化语句;判断条件语句;控制条件语句){ 循环体语句; } 执行流程: a:执行初始化语句 b:执行判断条件语句 如果这里是true,就继续 如果这里是false,循环就结束 c:执行循环体语句 d:执行控制条件语句 e:回到b B:注意事项 a:判断条件语句无论简单还是复杂,结果是boolean类型 b:循环体语句如果是一条,可以省略大括号,但是不建议 c:有分号就没有左大括号,有左大括号就没有分号 Dem

1245 - Harmonic Number (II)---LightOJ1245

http://lightoj.com/volume_showproblem.php?problem=1245 题目大意:一个数n除以1到n之和 分析:暴力肯定不行,我们可以先求1~sqrt(n)之间的每个数的个数,然后再求n除以1~sqrt(n)之间的数的和 这样算下来就只有2*sqrt(n)的复杂度 最后还要排除多加的,. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algor

在案例中学习shell编程

1. 编写脚本/root/bin/systeminfo.sh, 显示当前主机系统信息,包括主机名,IPv4 地址, 操作系统版本,内核版本,CPU 型号,内存大小,硬盘大小. 分析: 解释: 此题是一堆命令的堆叠,首先我们很容易在命令行通过命令知道题目中的一些结果. 主机名:hostname命令就可以了.IPV4地址:ifconfig命令是用来查看ip地址的,只是有很多多余内容,那么我们可以通过正则表达式, 以及cut命令即可截取. 操作系统版本:使用cat /etc/redhat-relase

hdu4405概率dp入门

Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1122    Accepted Submission(s): 762 Problem Description Hzz loves aeroplane chess very much. The chess map contains N+1 grids lab

第一、二天笔记

早上: 1:重点在于开发环境的设置(3课时) 2:编程基础(2课时): 3:Java语言介绍.main函数.类文件介绍 笔记: 1:常用的DOS命令 A:盘符切换 盘符: 然后回车 B:列出当前目录下的文件以及文件夹 dir 然后回车 C:创建目录(文件夹) 了解 md 目录名称 D:删除目录    了解 rd 目录名称 E:进入指定目录 a:单级目录 cd 目录名称 b:多级目录 cd 多级目录名称,目录间用\隔开的 F:回退指定目录 a:单级目录 cd .. b:多级目录 cd G:删除文件