欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109
有n个人准备去超市逛,其中第i个人买东西的概率是Pi。逛完以后你得知有r个人买了东西。根据这一信息,请计算每个人实际买了东西的概率。输入 n ( 1 ≤ n ≤ 20 ) 和 r ( 0 ≤ r ≤ n ) n(1≤n≤20)和r(0≤r≤n) n(1≤n≤20)和r(0≤r≤n),输出每个人实际买了东西的概率。
递归枚举所有可能的的n个人中哪些人买东西的情况,递归过程中用一维数组ans
储存r个人买了东西,某个人就是这r个人之一的概率,用sum存储r个人买东西的总概率。用ans[i]/sum
即为最终结果。
#include
using namespace std;
double p[25],ans[25],sum=0.0;
int N,r;
vector<int>Select;//存储r个买了东西的人的编号
void DFS(int i,double pcur){
if(i==N){//n个人枚举完成
if(Select.size()==r){//r个人买了东西
for(int i:Select)
ans[i]+=pcur;
sum+=pcur;
}
return;
}
Select.push_back(i);
DFS(i+1,pcur*p[i]);//当前编号为i的人买了东西
Select.pop_back();
DFS(i+1,pcur*(1-p[i]));//当前编号为i的人没买东西
}
int main(){
for(int ii=1;cin>>N>>r&&N!=0;++ii){
printf("Case %d:\n",ii);
memset(ans,0,sizeof(ans));
sum=0.0;
for(int i=0;i<N;++i)
cin>>p[i];
DFS(0,1.0);
for(int i=0;i<N;++i)
printf("%.6f\n",ans[i]/sum);
}
return 0;
}