题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495

题意:

  有n个礼物盒,m个人。

  最开始每个礼物盒中都有一个礼物。

  m个人依次随机选一个盒子,如果有礼物就拿走,然后放回空盒子。

  问你所有人得到总礼物数的期望。

题解:

  三种做法:期望dp,概率dp,推公式

  一、期望dp

    表示状态:

      dp[i] = 该第i个人拿箱子时的总礼物的期望

    找出答案:

      ans = dp[m]

    如何转移:

      对于第i个人,拿到礼物或没拿到。

      (1)φ(没拿到) = dp[i]  P(没拿到) = dp[i]/n

      (2)φ(拿到) = dp[i]+1  P(拿到) = (n-dp[i])/n

      综上:dp[i+1] = dp[i] * dp[i]/n + (dp[i]+1) * (n-dp[i])/n

    边界条件:

      dp[0] = 0

      还没开始拿的时候礼物数为0

  二、概率dp

    表示状态:

      dp[i] = 第i个人拿到礼物的概率

    找出答案:

      ans = ∑ dp[i]

      每个人得到礼物的概率 * 得到礼物的数量(为1) 之和。

    如何转移:

      对于第i个人,拿到礼物或没拿到。

      (1)没拿到:dp[i+1]依然等于dp[i],没拿到礼物的概率为1-dp[i].

      (2)拿到:dp[i+1] = dp[i] - 1/n,拿到的概率为dp[i].

      综上:dp[i+1] = dp[i] * (1 - dp[i]) + (dp[i] - 1/n) * dp[i]

    边界条件:

      dp[0] = 1

      所有盒子里都有礼物,第0个人一定拿到礼物。

  三、推公式

    m个人是独立的。

    对于每个礼物不被人选中的概率为((n-1)/n)^m

    那么不被选中的礼物数的期望就是 n*((n-1)/n)^m

    所以答案就是 n-n*((n-1)/n)^m

AC Code(expectation):

 // state expression:
// dp[i] = expectation
// i: considering ith person
//
// find the answer:
// ans = dp[m]
//
// transferring:
// dp[i+1] = dp[i] * dp[i]/n + (dp[i]+1) * (n-dp[i])/n
//
// boundary:
// dp[0] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_M 100005 using namespace std; int n,m;
double dp[MAX_M]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
{
dp[i+]=dp[i]*dp[i]/n+(dp[i]+1.0)*(n-dp[i])/n;
}
printf("%.10f\n",dp[m]);
}

AC Code(probability):

 // state expression:
// dp[i] = probability
// i: ith person got a gift
//
// find the answer:
// sigma dp[i]
//
// transferring:
// dp[i+1] = dp[i] * (1 - dp[i]) + (dp[i] - 1/n) * dp[i]
//
// boundary:
// dp[0] = 1
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_M 100005 using namespace std; int n,m;
double ans=;
double dp[MAX_M]; int main()
{
scanf("%d%d",&n,&m);
dp[]=;
for(int i=;i<m;i++)
{
dp[i+]=dp[i]*(1.0-dp[i])+(dp[i]-1.0/n)*dp[i];
ans+=dp[i];
}
printf("%.10f\n",ans);
}

AC Code(公式):

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h> using namespace std; int n,m; int main()
{
scanf("%d%d",&n,&m);
printf("%.10f\n",n-n*pow((n-1.0)/n,m));
}

SGU 495 Kids and Prizes:期望dp / 概率dp / 推公式的更多相关文章

  1. sgu 495. Kids and Prizes (简单概率dp 正推求期望)

    题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...

  2. SGU 495. Kids and Prizes( 数学期望 )

    题意: N个礼品箱, 每个礼品箱内的礼品只有第一个抽到的人能拿到. M个小孩每个人依次随机抽取一个,  求送出礼品数量的期望值. 1 ≤ N, M ≤ 100, 000 挺水的说..设f(x)表示前x ...

  3. SGU 495. Kids and Prizes

    水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...

  4. 495. Kids and Prizes

    http://acm.sgu.ru/problem.php?contest=0&problem=495 学习:当一条路走不通,换一种对象考虑,还有考虑对立面. 495. Kids and Pr ...

  5. 【整理】简单的数学期望和概率DP

    数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...

  6. POJ2096Collecting Bugs(数学期望,概率DP)

    问题: Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material ...

  7. 期望与概率dp

    概率与期望dp 定义: 概率:事件A发生的可能性,计作P(A) 期望:事件A结果的平均大小,记住E(x) ​ E(x)=每种结果的大小与其概率的乘积的和 注意计算概率时需要考虑是否要用容斥原理 期望d ...

  8. 动态规划之经典数学期望和概率DP

    起因:在一场训练赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有\(X,Y,Z\)块钱 ...

  9. 【SGU】495. Kids and Prizes

    http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...

随机推荐

  1. linux:date命令(转)

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...

  2. iOS 振动反馈

    代码地址如下:http://www.demodashi.com/demo/12461.html 1. 常用场景 继 iPhone7/7P 实体 home 键出现后,home 键再也无法通过真实的物理按 ...

  3. Windows Thin PC体验 & 语言包更改(win 7 included)

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 简介: Window ...

  4. VueJS自定义过滤器:new Vue({filters:{filter1:function(){}....}})

    Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化. 语法 <!-- 在两个大括号中 --> {{ message | capitalize }} <!-- 在 v-bin ...

  5. [ACM] hdu 1029 Ignatius and the Princess IV (动归或hash)

    Ignatius and the Princess IV Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32767K (Ja ...

  6. npm常用命令(转)

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  7. web翻译——插件

    很多时候,可能我们web项目中需要的只是机械式的翻译,并不需要什么利用xml或者js json等等实现逼真翻译,那样工作量太大.这时候可能你就需要这几款小工具来帮助你.当然,如果 对翻译或者你的项目外 ...

  8. erlang中遍历取出某个位置的最大值

    例:有这么一个列表,A = [["abc","bds",3],["ssdss","dddx",2],["sfa ...

  9. 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)

    01-learning-Lenet, 主要讲的是 如何用python写一个Lenet,以及用来对手写体数据进行分类(Mnist).从此教程可以知道如何用python写prototxt,知道如何单步训练 ...

  10. 目标跟踪之camshift---opencv中meanshift和camshift例子的应用

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...