poj 1322 chocolate

题目大意:

每次从一个有x种颜色巧克力的包里拿出一个巧克力,拿出每种不同颜色的巧克力的概率相同

若包外面有两个颜色相同的巧克力,则吃掉这两个巧克力

求n次操作后桌上有m个巧克力的概率

思路:

概率dp

dp i j表示i次操作后有j个巧克力的概率

则有两种转移,就是之前有j+1个然后取出来一个,有一个颜色相同

还有一个是之前有j-1个然后取出来一个,颜色不同

再加上奇数次操作无法得到偶数颗糖,偶数次无法得到奇数颗

以及只需要计算到小数点后三位所以当n>=1000时,可以按照奇偶直接剪枝

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<memory.h>
 7 #include<vector>
 8 #include<queue>
 9 #include<cstdlib>
10 using namespace std;
11 int n,m;
12 double c,f[2010][2010];
13 int main()
14 {
15     while(cin>>c>>n>>m&&c!=0)
16     {
17         if(n>1000) n=1000+(n&1);
18         f[0][0]=f[1][1]=1;
19         for(int i=2;i<=n;i++)
20         {
21             for(int j=0;j<=i;j++)
22             {
23                 f[i][j]=f[i-1][j+1]*((double)j+1)/c+f[i-1][j-1]*(c-(double)(j-1))/c;
24             }
25         }
26         printf("%.3lf
",f[n][m]);
27     }
28 }
View Code
原文地址:https://www.cnblogs.com/yyc-jack-0920/p/7221782.html