链接:点击打开链接
题意:有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; }