不难理解,第i题不能做出来的概率等于(1-a[i])(1-b[i])(1-c[i]);则能够做出来的概率d[i]=1-(1-a[i])(1-b[i])(1-c[i])。由于本题数量级很小,就用一个dfs就可以了。(其实是我不会其他的方法—。—)

#include"bits/stdc++.h"
using namespace std;
double a[12];
double b[12];
double c[12];
double d[12];
double ans[13];

void dfs(int count,int i,double gailv){
    //count代表已经走过的题数,i代表做对的个数,gailv代表当前情况的概率是多少
    if(count==12){
        ans[i]+=gailv;//如果走完了这12道题目,那么把这一种情况的概率加上
        return ;
    }
    dfs(count+1,i+1,gailv*d[count]);
    dfs(count+1,i,gailv*(1-d[count]));
    //第一:这一题做对,i加1,概率变为当前的概率×做对的概率
    //第二:这一题做错,i不变,概率变为当前的概率×做错的概率
}


int main() {
    fill(ans,ans+13,0);
    int i,j;
    for(i=0;i<12;++i){
        cin>>a[i];
    }
    for(i=0;i<12;++i){
        cin>>b[i];
    }
    for(i=0;i<12;++i){
        cin>>c[i];
    }

    for(i=0;i<12;++i){
        d[i]=1-((1-a[i])*(1-b[i])*(1-c[i]));
    }

    dfs(0,0,1.0);

    for(i=0;i<13;++i){
        printf("%.6lf\n",ans[i]);
    }

    return 0 ;
}