题意还是很好理解的。。
理解了题意后想概率怎么算。。。费了点劲受了点提示想出来了,对条件概率有了新的认识
开始写代码了,写不出来~,我还以为是自己几天没写手生了,然后发现。。。神奇的递归。。。。
一步一步按代码推出来,膜拜中
在我的思考中这道题关键是枚举所有情况后,如何判断得到的值是否是第i个人买东西的概率,看似很简单,嗯别人的代码也挺简单,但是真的不太好想
#include <stdio.h>
#include <string.h>
const int N = 30;
int n;
double p[N], ans[N];
double dfs(int c, int k, double pi)//(1,r,1)
{
if (c > n)
return k ? 0 : pi;//为什么k不等于0时返回0,因为这时不满足n各种r个买东西的条件,为什么?摊手~
double sum = 0;
if (k)
{
sum += dfs(c + 1, k - 1, pi * p[c]);
ans[c] += sum;
}
sum += dfs(c + 1, k, pi * (1 - p[c]));//注意这时的sum为if中的sum
return sum;
}
int main ()
{
int r, cas = 1;
while (scanf("%d%d", &n, &r), n + r)
{
for (int i = 1; i <= n; i++)
scanf("%lf", &p[i]);
memset(ans, 0, sizeof(ans));
printf("Case %d:\n", cas++);
double P = dfs(1, r, 1);
for (int i = 1; i <= n; i++)
printf("%.6lf\n", ans[i] / P);
}
return 0;
}
/*
3 2
0.10
0.20
0.30
0.413043
0.739130
0.847826
*/