UVA
来源:互联网 发布:nginx 1.12.0 配置 编辑:程序博客网 时间:2024/06/07 13:14
、题目网址‘点击打开链接
你会发现这
3 2
0.10
0.20
0.30
5 1
0.10
0.10
0.10
0.10
0.10
0 0
Sample Output
Case 1:
0.413043
0.739130
0.847826
Case 2:
0.200000
0.200000
0.200000
0.200000
0.200000
答案是这样出来的,以第一组为例 第一个人 的ans=(a/b)a=0.1*0.2*0.7+0.1*0.8*0.3
b=0.1*0.2*0.7+0.1*0.8*0.3+0.9*0.2*0.3; 三个数的b是一样的,a是选择
我当时觉得这是个排列组合一定超时,无法写,,
后来看题解,发现是可以用dfs的,方案思路跟选择一样
#include <iostream>#include<algorithm>#include<cstring>#include<string>#include<cstdio>using namespace std;int n,r;const int maxn=200+5;double s[maxn];double res;double ans[maxn];//存储每个人被选择的概率double dfs(int t,int k,double p ){ if(t>=n) { if(k!=0)//z注意k 此时的r如果没有凑够人,则证明这种选择方案不可行,返回0 return 0; else return p; } double sum=0; if(k) { sum+=dfs(t+1,k-1,p*s[t]); //选择这个人, ans[t]+=sum; } // cout<<sum<<endl; sum+=dfs(t+1,k,p*(1-s[t]));//不选这个人 return sum;}int main(){ int k=0; while(cin>>n>>r&&n) { k++; memset(ans,0,sizeof(ans)); for(int i=0;i<n;i++) cin>>s[i]; double p=dfs(0,r,1);//总概率 printf("Case %d:\n",k); for(int i=0;i<n;i++) printf("%.6f\n",ans[i]/p); } return 0;}
、