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 }

 

posted @ 2018-03-05 08:36  小小小的程序猿  阅读(318)  评论(0编辑  收藏  举报
window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") }