概率dp sgu495
Appoint description:
Description
ICPC (International Cardboard Producing Company) is in the business of producing cardboard boxes. Recently the company organized a contest for kids for the best design of a cardboard box and selected M winners. There are N prizes for the winners, each one carefully packed in a cardboard box (made by the ICPC, of course). The awarding process will be as follows:
- All the boxes with prizes will be stored in a separate room.
- The winners will enter the room, one at a time.
- Each winner selects one of the boxes.
- The selected box is opened by a representative of the organizing committee.
- If the box contains a prize, the winner takes it.
- If the box is empty (because the same box has already been selected by one or more previous winners), the winner will instead get a certificate printed on a sheet of excellent cardboard (made by ICPC, of course).
- Whether there is a prize or not, the box is re-sealed and returned to the room.
Input
The first and only line of the input file contains the values of N and M ( ).
Output
The first and only line of the output file should contain a single real number: the expected number of prizes given out. The answer is accepted as correct if either the absolute or the relative error is less than or equal to 10 -9.
Sample Input
sample input |
sample output |
5 7 |
3.951424 |
sample input |
sample output |
4 3 |
2.3125 |
题意:有n件奖品装在n个箱子里。M个人选择当中的一个箱子,每一个人取出一个箱子。假设有奖品取出,后将箱子放回。后面的人继续取箱子.问终于取出箱子个数的期望。
另dp[i]表示第i个人拿到奖品的概率则,dp[1]=1;若i-1取到了奖品则i获得奖品的概率为dp[i-1]-1/n,否则i得到奖品的概率为dp[i-1].转移方程为dp[i]=dp[i-1]*(dp[i-1]-1/n)+(1-dp[i-1])*dp[i-1].、
/************************************************************************* > File Name: t.cpp > Author: acvcla > Mail: acvcla@gmail.com > Created Time: 2014年10月21日 星期二 21时33分55秒 ************************************************************************/ #include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<cstring> #include<map> #include<queue> #include<stack> #include<string> #include<cstdlib> #include<ctime> #include<set> #include<math.h> using namespace std; typedef long long LL; const int maxn = 1e5 + 10; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back int n,m,f; double dp[maxn]; int main(int argc, char const *argv[]) { while(~scanf("%d%d",&n,&m)){ memset(dp,0,sizeof dp); dp[1]=1; double ans=1; for(int i=2;i<=m;i++){ dp[i]=dp[i-1]*(dp[i-1]-1.0/n)+(1-dp[i-1])*dp[i-1]; ans+=dp[i]; } printf("%.10f\n",ans); } return 0; }