版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}