不难理解,第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 ; }