不难理解,第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 ;
}
京公网安备 11010502036488号