Problem Description
给你n个巧克力,m个盒子,将n个巧克力放入m个盒子中,有盒子不空的概率是多少。
思路:
dp问题。dp[i][j]代表放了i个巧克力,j个盒子有巧克力的概率。
dp[i-1][j] * j/m 第i个巧克力 放进了有巧克力的盒子里。
dp[i-1][j-1] * (m-j+1)/m 第i个巧克力放进了其他空的盒子里。
dp[i][j] = dp[i-1][j] * j/m + dp[i-1][j-1] * (m-j+1)/m;
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
double dp[N][N];
int main()
{
int n, m;
int Case = 1;
while(~scanf("%d", &n))
{
if(n == -1) break;
scanf("%d", &m);
memset(dp, 0, sizeof(dp));
dp[1][1] = 1;//dp[1][j!=0] = 0;
for(int i = 2; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
dp[i][j] = dp[i-1][j]*(1.0*j/m) + dp[i-1][j-1]*(1.0*(m-j+1)/m);
}
}
printf("Case %d: %.7lf\n", Case++, 1-dp[n][m]);
}
return 0;
}