工作分配问题
时间限制(普通/Java) :
20000 MS/ 30000 MS 运行内存限制 : 65536 KByte
总提交 : 56 测试通过 : 34
总提交 : 56 测试通过 : 34
比赛描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为 c iy 。试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小。
设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。
输入
第一行有1 个正整数n (1≤n≤20)。接下来的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;
}