HDU 5045 DP+状压

2014 ACM/ICPC Asia Regional Shanghai Online

给出N个人做M道题的正确率,每道题只能由一个人做出,并且当所有人都做出来且仅做出一道题时,做过题的人才可以继续做题,求最大期望。

一共只有10个人,状压存储每个人是否已经做出题目,如果都作出则状态清0;


#include "stdio.h"
#include "string.h"

double Max(double a,double b)
{
	if (a<b) return b;else return a;
}
double ans,dp[1010][1050],a[1010][1010];
int main()
{
	int Case,ii,i,j,aim,k,n,m,peo;

	scanf("%d",&Case);
	for (ii=1;ii<=Case;ii++)
	{
		scanf("%d%d",&n,&m);
		for (i=1;i<=n;i++)
			for (j=1;j<=m;j++)
				scanf("%lf",&a[i][j]);

		printf("Case #%d: ",ii);

		aim=(1<<n)-1;
		for (i=0;i<=m;i++)
			for (j=0;j<=aim;j++)
				dp[i][j]=-1;

		dp[0][0]=0;

		for (j=1;j<=m;j++)
			for (i=0;i<=aim;i++)
				if (dp[j-1][i]!=-1)
					for (k=1;k<=n;k++)
					{
						peo=1<<(k-1);
						if ((i&peo)==peo) continue;
						peo|=i;
						if (peo==aim) peo=0;

						dp[j][peo]=Max(dp[j][peo],dp[j-1][i]+a[k][j]);
					}
		ans=0;
		for (i=0;i<=aim;i++)
			ans=Max(ans,dp[m][i]);

		printf("%.5lf\n",ans);
	}
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值