uva11181(概率)

来源:互联网 发布:大学生网络党校 编辑:程序博客网 时间:2024/06/01 09:38

题意还是很好理解的。。

理解了题意后想概率怎么算。。。费了点劲受了点提示想出来了,对条件概率有了新的认识

开始写代码了,写不出来~,我还以为是自己几天没写手生了,然后发现。。。神奇的递归。。。。

一步一步按代码推出来,膜拜中


在我的思考中这道题关键是枚举所有情况后,如何判断得到的值是否是第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
*/

原创粉丝点击