• Light OJ 1317 Throwing Balls into the Baskets 概率DP


    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
    ", cas++, ans);
    	}
    	return 0;
    }



  • 相关阅读:
    HashMap
    java反射
    arraylist和linkedlist区别
    int和Integer的区别
    java 数组排序并去重
    矩阵链乘法问题
    找零问题
    硬币收集问题
    最大借书量问题
    钢条切割问题
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6936303.html
Copyright © 2020-2023  润新知