ACM-Work Assignment
题目描述:Work Assignment
设有n件工作分配给n个人。将工作i 分配给第j 个人所需的费用为Cij。试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小。 设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。
输入
第一行有1 个正整数n (1≤n≤30)。接下来的n行,每行n个数,表示工作费用。
输出
的最小总费用。
样例输入
3 10 2 3 2 3 4 3 4 5
样例输出
9
解题思路:按照工作任务DFS搜索即可。注意要标记每个人只能做一项工作。
1 // Work Assignment.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 using namespace std; 10 11 const int MAX = 50; 12 int n,ans, map[MAX][MAX],vis[MAX]; 13 14 //第index项工作,现在前index-1项工作总费用 15 void DFS(int index, int sum) 16 { 17 //cout << "index:" << index << "\tsum:" << sum << "\tans:" << ans << endl; 18 if (index >= n) 19 { 20 ans = min(ans, sum); 21 return; 22 } 23 if (sum > ans) return; 24 25 //分配给第i个人 26 for (int i = 0; i < n; i++) 27 { 28 if (!vis[i]) 29 { 30 vis[i] = 1; 31 DFS(index + 1, sum + map[index][i]); 32 vis[i] = 0; 33 } 34 35 } 36 37 } 38 39 int main() 40 { 41 while (cin>>n && n) 42 { 43 for (int i = 0; i < n;i++) 44 for (int j = 0; j < n; j++) 45 cin >> map[i][j]; 46 47 ans = 0x3f3f3f3f; 48 memset(vis, 0, sizeof(vis)); 49 50 for (int i = 0; i < n; i++) 51 { 52 vis[i] = 1; 53 DFS(1, map[0][i]); 54 vis[i] = 0; 55 } 56 57 58 cout << ans << endl; 59 60 } 61 62 return 0; 63 }