poj 1322
题意是,c种不同颜色的巧克力,每种巧克力同样多,把巧克力一个一个拿到桌子上,当发现有相同颜色就全吃掉,求取出了n个后,还剩m个在桌子的概率。
直接求概率是不可能,要用到DP。
动态转移方程:
p[n][m]表示n个巧克力,还剩m个在台上的概率
p[n][m]=p[n-1][m-1]*p1+p[n-1][m+1]*p2
p1=(c-m+1)/c,p2=(m+1)/c
当m+n为奇时,概率为0
特别注意:当n很大时,概率处于稳定,但是还是要处理奇偶性
代码:
#include<iostream>
#include<fstream>
using namespace std;
double dp[1010][110];
int n,m,c;
void read(){
// ifstream cin("in.txt");
int i,j,k;
while(cin>>c>>n>>m)
{
if(c==0) return;
if(m>c||m>n||(m+n)%2)
{
printf("%.3lf\n",0);
continue;
}
memset(dp,0,sizeof(dp));
if(n>1000) n=1000+n%2;
dp[0][0]=1;
dp[1][1]=1;
for(i=2;i<=n;i++)
for(j=0;j<=c;j++)
{
if(j>0) dp[i][j]=dp[i-1][j-1]*(c-j+1)/c;
if(j<c) dp[i][j]+=dp[i-1][j+1]*(j+1)/c;
}
printf("%.3lf\n",dp[n][m]);
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号