uva11181(概率)

题意还是很好理解的。。

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

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

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值