题目链接:Gift Exchanging UVA - 10417
题目大意:Xmas过生日宴请了n个朋友。分别给出五种包装的礼物的个数,以及每个朋友分别送出五种礼物的概率(和为1)。第一个人和Xmas是最好的朋友,求Xmas拿哪一件礼物可以最大概率的拿到最好朋友送的礼物。若概率相同,拿包装好最小的礼物。
dfs枚举所有情况,然后记录1号朋友送出每一种包装的礼物的概率,然后输出该概率除以该包装礼物个数的最大值。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=5;
const int M=15;
const double eps=1e-9;
double p[M][N],res[N];
int cnt[N];
int n,t;
double dfs(int cur,double prob)
{
if(cur==n)
return prob;
double ans=0;
for(int i=0;i<N;i++)
if(cnt[i]&&p[cur][i]>eps)
{
cnt[i]--;
double tem=dfs(cur+1,prob*p[cur][i]);
ans+=tem;
if(cur==0)
res[i]+=tem;
cnt[i]++;
}
return ans;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<N;i++)
scanf("%d",&cnt[i]);
for(int i=0;i<n;i++)
for(int j=0;j<N;j++)
scanf("%lf",&p[i][j]);
memset(res,0,sizeof(res));
double all=dfs(0,1);
int id=0;
double ans=0;
for(int i=0;i<N;i++)
{
double tem=res[i]/cnt[i]; //从该包装中所有礼物恰好能选到bf送的礼物概率为1/cnt[i]
if(tem-ans>eps)
{
id=i;
ans=tem;
}
}
printf("%d %.3lf\n",id+1,ans/all);
}
return 0;
}