工作效益
http://218.5.5.242:9018/JudgeOnline/problem.php?id=1273
题目描述
给定不同人做不同工作的一个效益矩阵,要求每项工作只能分配一人完成,一人也最多分配一个工作,试编程求解完成工作最大效益。
输入
第一行两个数分别为人数n和工作数m,n≥m且1≤n,m≤20。
以下n行,每行m个数字,其中第i行第j列表示第i个人做第j项工作的效益。
输出
输出一个整数,表示最大的工作效益。
样例输入
5 5 13 11 10 4 7 13 10 10 8 5 5 9 7 7 4 15 12 10 11 5 10 11 8 8 4
样例输出
50
题解
仅仅剪枝过不了。。要加一些贪心的搜索策略QAQ
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include<iostream> #include<algorithm> #include<cstdio> using namespace std; int n,m,ans,Now; int a[25][25],sum[25],mx[25]; int id[25][25]; bool mark[25]; bool cmp(int x,int y) { 	return a[x][Now]>a[y][Now]; } void dfs(int x,int tot) { 	if(tot+sum[x]<=ans) 		return; 	if(x==m+1) 	{ 		ans=max(ans,tot); 		return; 	} 	for(int i=1;i<=n;i++) 	{ 		int t=id[x][i]; 		if(!mark[t]) 		{ 			mark[t]=1; 			dfs(x+1,tot+a[t][x]); 			mark[t]=0; 		} 	} } int main() { 	scanf("%d%d",&n,&m); 	for(int i=1;i<=n;i++) 		for(int j=1;j<=m;j++) 			scanf("%d",&a[i][j]); 	for(int i=1;i<=n;i++) 		for(int j=1;j<=m;j++) 			mx[j]=max(mx[j],a[i][j]); 	for(int i=1;i<=m;i++) 	{ 		Now=i; 		for(int j=1;j<=n;j++) 			id[i][j]=j; 		sort(id[i]+1,id[i]+n+1,cmp); 	} 	for(int i=m;i;i--) 		sum[i]=sum[i+1]+mx[i]; 	dfs(1,0); 	printf("%d\n",ans); 	return 0; } | 
                                  Subscribe  
                            
                                                                        
                    