hdu 5045 状压dp

来源:互联网 发布:demo软件是什么意思 编辑:程序博客网 时间:2024/06/05 08:04

因为所有人做题数量差不能大于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;}


0 0
原创粉丝点击