非常清楚的讲解,顺带着明白了动态规划实在咋回事
蓝桥杯 试题 算法训练 印章_okok__TXF的博客-CSDN博客_印章 算法
代码加了一丢丢注释,不过大佬原本说的就很清楚了,代码也很清楚明白
#include <iostream>
#include <cmath>
using namespace std;
double dp[25][25], p;
int main()
{
//记住是小数啊,要*1.0进行类型转换的
int n, m;
cin >> n >> m;
p = 1.0 / n; //每种出现的概率
for ( int i = 1; i <= m; ++i ) {
for ( int j = 1; j <= n; ++j ) {
if ( i < j ) dp[i][j] = 0; //买的还没有种类多,肯定凑不齐
if ( j == 1 ) { //买了好多张,只凑齐了一种
dp[i][j] = pow (p, i-1); //p^(i-1)
}
else {
dp[i][j] = dp[i-1][j] * (j*1.0/n) + dp[i-1][j-1] * ((n-j+1)*1.0/n);
//dp[i][j] = 第j个的种类前面已经有了 + 第j个种类前面还莫得
//*1.0是为了类型转换,整数转浮点
}
}
}
printf("%.4lf ",dp[m][n]);
return 0;
}
|