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\n",sum);//切勿使用%.3lf
}
return 0;
}
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;
}
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)