链接:点击打开链接
题意:有n个人做m道题目,给出每个人对每道题答对的概率,求最后答出所有题目概率的最大值。要求每两个人之间答题的数目不能超过1
代码:
#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
double s[20][2005],dp[1005][1050];
int main(){
int t,i,j,k,m,n,cas,tmp;
double ans;
cas=1;
scanf("%d",&t);
while(t--){ //dp[i][j]表示i道题状态为j时的概率
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%lf",&s[i][j]);
for(i=0;i<1005;i++)
for(j=0;j<1050;j++)
dp[i][j]=-1.0;
dp[0][0]=0;
for(i=1;i<=m;i++){
for(j=0;j<(1<<n);j++){
if(dp[i-1][j]<0)
continue;
for(k=0;k<n;k++){
if(!(j&(1<<k))){ //当前人没做过题
tmp=j|(1<<k);
if(tmp==(1<<n)-1) //当N个人全做过题之后,将状态置0
tmp=0;
dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]+s[k+1][i]);
}
}
}
}
ans=0;
for(i=0;i<(1<<n);i++)
ans=max(ans,dp[m][i]);
printf("Case #%d: %.5lf\n",cas++,ans);
}
return 0;
}