版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题意:
有n个奖品,m个人排队来选礼物,对于每个人,他打开的盒子,可能有礼物,也有可能已经被之前的人取走了,然后把盒子放回原处。求最后m个人取走礼物的期望总数。
多组数据
保留9为小数
思路:f[i] 表示第i个人取走礼物的期望总数,那么对于f[i] 来说, 它有f[i - 1] / n 的概率取到一个空的,1 - f[i - 1] / n 的概率取到一个礼物,那么转移方程就是f[i] = f[i - 1] / n * f[i - 1] + (n - f[i - 1] ) / n * (f[i - 1] + 1), 由于求得是期望,所以我们初始f[m] = 0, 目标状态是f[0].
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 +10;
double f[maxn];
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
for(int i = 0; i <= m + 2; ++i) f[i] = 0;
f[m] = 0;
for(int i = m - 1; i >= 0; --i)
{
f[i] = ((double)n - f[i + 1]) / n * (f[i + 1] + 1) + f[i + 1] / n * f[i + 1];
}
printf("%.10f\n", f[0]);
}
return 0;
}