原题:http://acm.sgu.ru/problem.php?contest=0&problem=495
题意:有n个奖品,奖品各自放在盒子里,m个人轮流选取,若盒中有奖品则拿走,但不管怎样,盒子依然放回。问得到奖品数的期望。
思路:1)数学推理
每个奖品不被选中的概率为(1-1/n)^m,那么每个奖品被选中的概率为1-(1-1/n)^m;
所以总期望为n*(1-(1-1/n)^m);
2)概率dp
dp[i]表示到第i个人得到奖品数的期望;所以dp[i]等于上一个人得到的奖品数加上这个人得到的奖品数;
若此人得到了奖品则概率为(n-dp[i-1])/n, 若没得到则概率为dp[i-1]/n;
所以dp[i] = dp[i-1]+1*(n-dp[i-1])/n+0*dp[i-1]/n;
#include<stdio.h>
#include<math.h>
double n, m;
int main()
{
while(scanf("%lf%lf", &n, &m)!=EOF)
printf("%.9f\n", n*(1-pow((1-1/n), m)));
return 0;
}
#include<stdio.h>
#include<string.h>
double n;
int m;
double dp[100005];
int main()
{
while(scanf("%lf%d", &n, &m)!=EOF)
{
memset(dp, 0, sizeof(dp));
dp[1] = 1;
for(int i = 2;i<=m;i++)
dp[i] = dp[i-1]+(n-dp[i-1])/n;
printf("%.9f\n", dp[m]);
}
return 0;
}