1776工作分配问题(搜索+剪枝)

Description

设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为 cij。试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小。
设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。

Input

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

Output

将计算出的最小总费用输出。

Sample

Input 

3
10 2 3
2 3 4
3 4 5

Output 

9
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <string>
 5 #include <map>
 6 
 7 #define inf 0x3f3f3f3f
 8 
 9 using namespace std;
10 
11 int a[25][25], book[25];
12 int minn;
13 
14 void dfs(int cur, int sum, int n)
15 {
16     if(sum >= minn) return;
17     else if(cur==n) minn = min(minn, sum);
18     else
19     {
20         int i;
21         for(i=0;i<n;i++)
22         {
23             if(book[i]==0)
24             {
25                 book[i] = 1;
26                 dfs(cur+1, sum+a[cur][i], n);
27                 book[i] = 0;
28             }
29         }
30     }
31 }
32 
33 int main()
34 {
35     int n, i, j;
36     cin >> n;
37     for(i=0;i<n;i++)
38     {
39         for(j=0;j<n;j++)
40         {
41             cin >> a[i][j];
42         }
43     }
44     minn = inf;
45     dfs(0, 0, n);
46     cout << minn << endl;
47     return 0;
48 }

 

posted @ 2020-12-08 00:41  Xxiaoyu  阅读(92)  评论(0编辑  收藏  举报