印章(蓝桥杯)C语言

印章(蓝桥杯)C语言,第1张

【问题描述】

共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。

【输入格式】

一行两个正整数n和m

【输出格式】

一个实数P表示答案,保留4位小数。

【样例输入】

2,3

【样例输出】

0.7500

【解析】

        首先我们知道这道题目是DP类型的,就开门见山了。

        1.在做DP题目的时候,我们首先要确定这道题是几维的DP数组?

我们分析题目可知,这道题有两个极其清晰的条件,就是购买的次数和需要集齐的印章个数,所以这是一道二维数组题。

        2.如何确定DP数组的初始条件,对于一维的,一般是前两个元素,对于二维而言,一般是第一行和第一列,如果条件多的话还能多初始几行;对于三维而言,我……暂时做不出来。

前面说了有两个条件,那么在二维数组中,那个是行,哪个是列呢,我们来分析一下。

假设要集齐的印章个数为行,购买的次数为列。对于初始数组的时候貌似基本都是零,没有可利用的数据,可知不是。

所以购买的次数为行,勋章的集齐个数为列。

初始化数组:前提条件(我们可知当购买的次数小于勋章个数时,P==0)。

我们先把这些i

			if(i

然后分析第一列元素,购买i次,只集齐一种印章,那么P=(1/n)^i *n。

解释:购买的结果共有1/n)^i 种,但是元素全部一样的却只有n种。

			else if(j==1)
				dp[i][j]=pow(p,i-1);

接着就是一般情况,对于其他元素而言,dp[i][j]这个数该如何计算呢?

这个元素就代表购买i次,集齐j个印章。

有两个情况:

第i次不要要集齐新的印章了,也就是说前i-1次集齐了j种。

计算公式:dp[i-1][j]*(j/n)

第i次需要集齐新印章,也就是说前i-1次集齐了j-1种。

计算公式:dp[i-1][j]*(n-(j-1)/n)

#include
#include
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	double p=1.0/n;
	double dp[m+1][n+1];
	int i,j;
	for(i=1;i

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002931.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)