题目大意:
每次从一个有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 }