您的位置:首页 > 其它

hdu 5045 状压dp

2016-05-24 23:36 295 查看
因为所有人做题数量差不能大于1 所以可以把每n道题看成一组 每一组必须由每个人完成一道的方式完成

dp[i][j] i代表当前题数 j代表当前队员状态

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double dp[1005][1050],r[11][1005],ans,tmp;
int T,n,m,i,j,first,t,k,MAX,kase=0;
int main()
{//freopen("C:\\Users\\Administrator\\Desktop\\input.txt","r",stdin);
scanf("%d",&T);
while(T--){
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
MAX=1<<n;
for(i=0;i<n;i++)for(j=1;j<=m;j++)scanf("%lf",&r[i][j]);
ans=0;tmp=0;
for(t=1;t<=(m+n)/n;t++){
first=(t-1)*n+1;
for(j=0;j<n;j++)//枚举第几道题
for(i=0;i<MAX;i++)//枚举人物状态
for(k=0;k<n;k++)//枚举第几个人
if((i&(1<<k))==0) dp[first+j+1][i|(1<<k)]=max(dp[first+j+1][i|(1<<k)],dp[first+j][i]+r[k][first+j]);
ans+=dp[first+n][MAX-1];
}
printf("Case #%d: %.5lf\n",++kase,ans);
for(i=0;i<n;i++)for(j=1;j<=m;j++)r[i][j]=0;
for(i=0;i<m;i++)for(j=0;j<MAX;j++)dp[i][j]=0;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: