1. 题目描述
2. 说明
非常感谢大佬的博客分享。讲解非常详细,附上链接。如果有朋友看到我这篇文章,可以直接点击下面链接去大佬博客,本人写只是为了记录一下自己的学习过程https://blog.csdn.net/okok__TXF/article/details/121099645?ops_request_misc=%7B%22request%5Fid%22%3A%22164179882416780255247794%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=164179882416780255247794&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-121099645.pc_search_insert_ulrmf&utm_term=蓝桥杯印章&spm=1018.2226.3001.4187#commentBox
3. 思路
虽然开始一看就知道这是个算概率的问题。但是如何用代码能解决这一类问题确实不会,然后看了一下题目关键词是dp,又去做了下0-1背包,通过上文博主的解释恍然大悟。
然后感觉这个题的关键在于以下方程:
dp[i][j]=dp[i-1][j-1]*(1-(j-1)*1.0/n)+dp[i-1][j]*((j*1.0)/n);
解释
4. 代码
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main ()
{
int n,m;
cin>>n>>m;
double p=1.0/n;
double dp[m+1][n+1];
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
if(i<j)
dp[i][j]=0;
else if(j==1)
{
dp[i][j]=pow(p,i-1);
}
else
{
dp[i][j]=dp[i-1][j-1]*(1-(j-1)*1.0/n)+dp[i-1][j]*((j*1.0)/n);
}
}
}
cout<<fixed<<setprecision(4)<<dp[m][n];
return 0;
}