SOJ 4552 [期望,概率]
#include
usingnamespace std;
int n, m;
doubledp[55][55];
int main ()
{
while(~scanf("%d%d", &n, &m))
{
if(n ==0)//当n等于0的时候,只有m也等于0的时候有意义 {
if(m ==0)
printf("0.000000 1.000000\n");
else
printf("0.000000 0.000000\n");
continue;
}
doubleans1 =0.0;
for(inti =1; i <= n; i++)//期望ans1 +=double(1.0/ (double)i);
ans1 *= (double)n;
if(n > m)//非法状态 {
printf("%.6f 0.000000\n", ans1);
continue;
}
if(n ==1)//当n等于1的时候,只有m也等于1的时候有意义 {
if(m ==1)
printf("%.6f 1.000000\n", ans1);
else
printf("%.6f 0.000000\n", ans1);
continue;
}
for(inti =0; i <=50; i++)
for(intj =0; j <=50; j++)
dp[i][j] =0.0;
dp[0][0] =1.0;//dp[i][j]:表示抽取i次,得到j张卡牌的概率。for(inti =0; i <= m; i++)//选的次数for(intj =0; j <= n && j <= n; j++)//得到的卡牌 {
dp[i +1][j +1] += dp[i][j] *double(double(n - j) /double(n));
dp[i +1][j] += dp[i][j] *double(double(j) /double(n));
}
//要保证最后一抽牌刚好满足抽了n张不同的牌printf("%.6f %.6f\n", ans1, dp[m -1][n -1]*double(1.0/ (double)n));
}
return0;
}
来源: http://www.bubuko.com/infodetail-2019156.html