标签:
题意:
有N个箱子放有礼物,M个人依次取。如果取到的箱子有礼物,则拿走礼物。无论有没有拿到礼物,都将箱子原状放回。(所以就有可能后面的人拿到前面的人拿过的箱子,然后就没得到奖品)。问,最后能拿走的礼物数量的期望。
两种思路,给跪了,,,还是没有想出来。。。。
m个人是独立的。
对于每个礼物不被人选中的概率为((n-1)/n)^m
那么不被选中的礼物数的期望就是 n*((n-1)/n)^m
所以答案就是 n-n*((n-1)/n)^m;
这个地方自己老想着求1/n,结果没转过来。。。orz
概率dp
那么这道题目就是:设dp[i] 表示i个人拿过以后,主办方送出礼物的期望数量。
那么,对于第i个人,可能拿到,也可能没拿到礼物,转移方程就是:
dp[i] = (N-dp[i-1])/N * (dp[i-1] + 1) + (dp[i-1])/N * dp[i-1];
拿到的概率 拿到的话就要多送一个 没拿到的概率 没拿到那还是一样
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
printf("%.9lf\n",n-n*1.0*pow(((1.0*n-1)/(n*1.0)),m));
}
return 0;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<cstring>
using namespace std;
int main()
{
int n,m;
double dp[100005];
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[0]=0;
dp[1]=1;
for(int i=2;i<=m;i++)
dp[i]=dp[i-1]*(1-dp[i-1])+dp[i-1]*(dp[i-1]-1.0/n);
double s=0;
for(int i=1;i<=m;i++)
s+=dp[i];
printf("%.9lf\n",s);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/wweiainn/article/details/43945011