poj 1322 chocolate

本文介绍了一种使用概率动态规划解决特定巧克力问题的方法。该问题要求计算在一系列操作后桌上剩余特定数量巧克力的概率,通过逐步迭代计算不同状态下的概率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

每次从一个有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\n",f[n][m]);
27     }
28 }
View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/7221782.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值