UVa11181 Probability|Given

暴力算概率即可。

用这个式子:P(Ai|B)=P(AiB)/P(B)

不过。。貌似有递推的常数做法?

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 20 + 1;

int N, R;
double p[MAXN], a[MAXN];

inline int bitcount(int x)
{return x == 0 ? 0 : (x & 1) + bitcount(x >> 1);}

int main()
{
    int t = 0;
    while(cin>>N>>R, (N + R))
    {
        for(int i = 0; i < N; i++) scanf("%lf", &p[i]);
        memset(a, 0, sizeof(a));

        printf("Case %d:\n", ++t);
        if(R == 0) {
            for(int i = 0; i < N; i++) puts("0.000000");
            continue;
        }

        double rp = 0.0;
        for(int state = 0; state < (1 << N); state++)
        {
            int cnt = bitcount(state);
            if(cnt != R) continue;

            double tmp = 1.0;
            for(int i = 0; i < N; i++)
                if(state & (1 << i)) tmp *= p[i];
                else tmp *= (1 - p[i]);
            rp += tmp;
            for(int i = 0; i < N; i++) 
                if(state & (1 << i)) a[i] += tmp;
        }

        for(int i = 0; i < N; i++) printf("%.6lf\n", a[i] / rp);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wsmrxc/p/9296047.html
今日推荐