UVA_11181
设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西。
那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同时总状态并不多,因此我们可以枚举买东西的状态预处理出P(AiB)和P(B),再代入计算即可。
#include#include #define MAXD 25 int N, R; double ap[MAXD], p[MAXD]; void solve() { int i, j, k; double ans, rp = 0; for(i = 0; i < N; i ++) scanf("%lf", &p[i]); if(R == 0) { for(i = 0; i < N; i ++) printf("0.000000\n"); return ; } memset(ap, 0, sizeof(ap)); for(i = 0; i < (1 << N); i ++) { k = 0; for(j = 0; j < N; j ++) if((1 << j) & i) k ++; if(k == R) { ans = 1; for(j = 0; j < N; j ++) { if((1 << j) & i) ans *= p[j]; else ans *= (1 - p[j]); } rp += ans; for(j = 0; j < N; j ++) if((1 << j) & i) ap[j] += ans; } } for(i = 0; i < N; i ++) printf("%.6lf\n", ap[i] / rp); } int main() { int t = 0; for(;;) { scanf("%d%d", &N, &R); if(!N && !R) break; printf("Case %d:\n", ++ t); solve(); } return 0; }