poj 1322 Chocolate

来源:互联网 发布:天猫是淘宝的吗 编辑:程序博客网 时间:2024/05/18 01:51

概率问题,第一次接触
几个结论
„ 我们记P(N,M)表示拿出N块巧克力后,桌上还
剩M块巧克力的概率
„ 我们可以得到下面的结论
( 1) P(N,M)=0 当N+M为奇数
( 2) P(N,M)=P(N-1,M-1)*P1+P(N-1,M+1)*P2
其中P1=(C-M+1)/C,P2=(M+1)/C
另外,dp的数组大小,dp[1001][101]报错,dp[1010][101]通过,难怪关于数组的大小问题,网上很多人上来就是1010,10010,….10等

#include<iostream>#include<string.h>#include<math.h>#include<fstream>#include<algorithm>#include<stdio.h>#include<queue>#include<vector> #define MAXSIZE 100using namespace std;double dp[1001][101];int C = 0, M = 0, N = 0; int main(){    //freopen("data_1322.txt","r",stdin);    while(true)    {        scanf("%d", &C);        if (C == 0) break;        scanf("%d%d", &N, &M);        memset(dp, 0, sizeof(dp));        dp[0][0] = 1;        if (M > C || M > N){            printf("0.000\n");            continue;        }        if (N > 1000)        {            if (N  % 2)            {                N = 1001;            }else            {                N = 1000;            }        }        for (int i = 1; i <= N; i++)        {            dp[i][0] = dp[i - 1][1] / C;            dp[i][C] = dp[i - 1][C - 1] / C;            for (int j = 1; j < C; j++)            {                dp[i][j] = dp[i-1][j+1]*(j+1)/C + dp[i-1][j-1]*(C-j+1)/C;            }        }        printf("%.3lf\n", dp[N][M]);    }    return 0;}
0 0