n个人 m个篮子 每一轮每个人可以选m个篮子中一个扔球 扔中的概率都是p 求k轮后所有篮子里面球数量的期望值
根据全期望公式 进行一轮球数量的期望值为dp[1]*1+dp[2]*2+...+dp[n]*n 记为w
其中dp[i]为i个人扔中的概率 dp[i] = C(n, i)*p^i*(1-p)^(n-i) 最终答案为w*k
#include <cstdio> #include <cstring> using namespace std; double dp[20]; double a[20], b[20]; double cm(int n, int m) { double ans = 1; for(int i = 1; i <= m; i++) { ans *= (double)n--; ans /= (double)i; } return ans; } int main() { int T; int cas = 1; scanf("%d", &T); while(T--) { int n, m, k; double p; scanf("%d %d %d %lf", &n, &m, &k, &p); dp[0] = a[0] = b[0] = 1; for(int i = 1; i <= n; i++) { a[i] = a[i-1]*p; b[i] = b[i-1]*(1-p); } for(int i = 0; i <= n; i++) { dp[i] = cm(n, i)*a[i]*b[n-i]; } double ans = 0; for(int i = 1; i <= n; i++) ans += dp[i]*(double)i; ans *= (double)k; printf("Case %d: %.10lf\n", cas++, ans); } return 0; }