标签:
题意:
有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