码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-21 21:05:57      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:eof   its   can   bit   区域   c++   mic   turn   names   

#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\n",sum);//切勿使用%.3lf
    }
    return 0;
}
 

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

标签:eof   its   can   bit   区域   c++   mic   turn   names   

原文地址:https://www.cnblogs.com/ldudxy/p/9513757.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!