试题 算法训练 印章

问题描述
  共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。
输入格式
  一行两个正整数n和m
输出格式
  一个实数P表示答案,保留4位小数。
样例输入
2 3
样例输出
0.7500
数据规模和约定
1≤n,m≤20

没完全弄懂。。。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

import javax.rmi.ssl.SslRMIClientSocketFactory;

public class Main {
	
	public static void main(String[] args) {
		double [][]dp=new double[21][21];
		int i,j,n,m;
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		double t=1/(double)n;
		
		//dp[i][j]表示抽取i次仅获得j种印章的概率。
		//共有n种图案的印章  小A买了m张印章
		for(i=0;i<m;i++) dp[i][0]=Math.pow(t,(double)i);
		for(i=1;i<n;i++) dp[0][i]=0;
	
		
		for(i=1;i<m;i++){
			for(j=1;j<n;j++) dp[i][j]=dp[i-1][j]*(((double)j+1)*t)+dp[i-1][j-1]*(1-(double)j*t);
	                         //由于i与j为角标,所以带入推理出来的公式时i,j要+1
		}
	
		String ans=String.format("%.4f", dp[m-1][n-1]);
		System.out.println(ans);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值