• 2017乌鲁木齐区域赛A(动态规划,组合数学,期望)


    #include<bits/stdc++.h>
    using namespace std;
    double c[110][110];
    double g[110];
    double dp[110][110];
    int n,m,k;
    void cnm()
    {
        c[0][0]=1;
        for(int i=1;i<=100;i++)
        {
            c[i][0]=1;
            c[i][i]=1;
            for(int j=1;j<i;j++)
            {
                c[i][j]=c[i-1][j-1]+c[i-1][j];//组合数挑选硬币可能的数量
            }
        }
    }
    void gailv()//预处理i枚向上的概率
    {
        g[0]=1;
        for(int i=1;i<=100;i++)
            g[i]=g[i-1]/2;
    }
    int main()
    {
        cnm();
        gailv();
        int t;
        scanf("%d",&t);
        for(int i=1;i<=t;i++)
        {
            memset(dp,0,sizeof(dp));
            scanf("%d%d%d",&n,&m,&k);
            dp[0][0]=1;
            for(int j=0;j<m;j++)
            {
                for(int l=0;l<=n;l++)
                {
                    for(int p=0;p<=k;p++)//抛k枚硬币有p枚向上
                    {
                        if(k+l<=n)//原本向上的枚数加上这次向上的枚数不超过n
                        {
                            dp[j+1][l+p]+=dp[j][l]*c[k][p]*g[k];
                        }
                        else//超过n的话就会有已经向上的被重抛,导致向上的概率变低
                        {
                            dp[j+1][n+p-k]+=dp[j][l]*c[k][p]*g[k];
                        }
                    }
                }
            }
            double sum=0;
            for(int i=1;i<=n;i++)
            {
                sum+=dp[m][i]*i;//概率乘上权值
            }
            printf("%.3f ",sum);//切勿使用%.3lf
        }
        return 0;
    }
     
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    ndt histogram_direction
    rplidar & hector slam without odometry
    点云的基本几何计算
    rplidar测试
    使用ZXing.Net生成与识别二维码(QR Code)
    C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
    .NET 二维码生成(ThoughtWorks.QRCode)
    zxing二维码的生成与解码(C#)
    netsh interface portproxy的一个简单例子
    Redis 客户端连接
  • 原文地址:https://www.cnblogs.com/ldudxy/p/9513757.html
Copyright © 2020-2023  润新知