SGU 495 Kids and Prizes

题意:给n个盒子,每个盒子里有一个礼物。有m个人,每个人拿起一个盒子,如果里面有礼物则将礼物取出并带走,无论里面有没有礼物都将盒子留下。问这m个人带走礼物数量的期望。

解法:设d[i]表示第i个人拿盒子以后,总共带走的礼物数量的期望。d[i] = (d[i-1] + 1)* (n-d[i-1]) / n + d[i-1] * d[i-1] / n。复杂度O(m)。

   虽然解法写着很简单,但是做多了概率dp的题以后,我一来就用了别的方法来设置数组,弄了半天才做出来。

tag:math, 概率dp

 1 /*
 2  * Author:  Plumrain
 3  * Created Time:  2013-11-12 18:35
 4  * File Name: DP-SGU-495.cpp
 5  */
 6 #include <iostream>
 7 #include <cstdio>
 8 
 9 using namespace std;
10 
11 int main()
12 {
13     int n, m;
14     while (scanf ("%d%d", &n, &m) != EOF){
15         double x[2] = {1.0};
16         for (int i = 2; i <= m; ++ i){
17             x[1] = (x[0] + 1) * (n - x[0]) / n + x[0] * x[0] / n;
18             x[0] = x[1];
19         }
20         if (m > 1)
21             printf ("%.10f\n", x[1]);
22         else
23             printf ("%.10f\n", m ? 1.0 : 0.0 );
24     }
25     return 0;
26 }
View Code

 

posted @ 2013-11-12 22:28  Plumrain  阅读(198)  评论(0编辑  收藏  举报