UVA - 11181

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/78640608

题目链接:https://vjudge.net/problem/UVA-11181

解题思路:条件概率,r个人选中第i个的概率除以r个人的概率

AC代码:

#include<cstdio>
using namespace std;

const int MAXN = 30;

double getdata[MAXN], dominantor, numerator;

int n, r;

void Dfs(int time,int pos,double ans,double &allans)
{
    if (time == r)
    {
        for (int i = pos;i < n;i++)
            ans *= (1 - getdata[i]);
        allans += ans;
        return;
    }
    if (pos < n)
    {
        Dfs(time + 1, pos + 1, ans*getdata[pos], allans);
        Dfs(time, pos + 1, ans*(1 - getdata[pos]), allans);
    }

}

int main()
{
    for (int cas=1;scanf("%d%d", &n, &r) == 2 && (n || r);cas++)
    {
        for (int i = 0;i < n;i++)
            scanf("%lf", getdata + i);
        dominantor = 0;
        Dfs(0, 0, 1, dominantor);
        printf("Case %d:\n", cas);
        for (int i = 0;i < n;i++)
        {
            numerator = 0;
            double tmp = getdata[i];
            getdata[i] = 1;
            Dfs(0, 0, 1, numerator);
            getdata[i] = tmp;
            printf("%.6lf\n", tmp*numerator / dominantor);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/78640608
今日推荐