南邮 OJ 1288 工作分配问题

工作分配问题

时间限制(普通/Java) :  20000 MS/ 30000 MS          运行内存限制 : 65536 KByte
总提交 : 56            测试通过 : 34 

比赛描述

设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为 c iy 。试设计一个算法,为每一个人都分配件不同的工作,并使总费用达到最小。

设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。



输入

第一行有个正整数n (1n20)。接下来的n行,每行n个数,表示工作费用。

输出

计算出最小总费用。

样例输入

3
10 2 3
2 3 4
3 4 5

样例输出

9

提示

undefined

题目来源

算法设计与实验题解



#include<iostream>
using namespace std;
int a[20][20];
bool visited[20];
int n,min_val,current;
void handle(int i){
	if(min_val<=current){		//加上这个剪枝,直接由1935MS降到了6MS
		return;
	}
	if(n==i){
		if(min_val>current){
			min_val = current;
		}
		return;
	}
	int j;
	for(j=0; j<n; j++){
		if(!visited[j]){
			visited[j] = 1;
			current += a[i][j];
			handle(i+1);
			current -= a[i][j];
			visited[j] = 0;
		}
	}
}
int main(){
	int i,j;
	cin>>n;
	for(i=0; i<n; i++){
		for(j=0; j<n; j++){
			cin>>a[i][j];
		}
	}
	min_val = INT_MAX;
	handle(0);
	cout<<min_val<<endl;
}






你可能感兴趣的:(ACM,南邮OJ,工作分配问题)