• 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;
    }
     
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    软件产品案例分析(团队)
    Beta 冲刺 (2/7)
    Beta 冲刺 (1/7)
    机器学习笔记
    第一次作业
    机器学习第一个次个人作业
    软工实践个人总结
    第10组 Beta版本演示
    第10组 Beta冲刺(5/5)
    第10组 Beta冲刺(4/5)
  • 原文地址:https://www.cnblogs.com/ldudxy/p/9513757.html
Copyright © 2020-2023  润新知