Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem 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 5Sample Output 9
#include<bits/stdc++.h> using namespace std; int n, f[30][30]; int s = 0, sum = 99999; int vis[30];//列的访问标记 void dfs(int x, int y) { s += f[x][y]; vis[y] = 1; if(s >= sum) return;///=====别忘记了 if(x == n) { if(s < sum) sum = s;//剪枝,不加这句会超时... return; } for(int i = 1; i <= n; i++) { if(!vis[i]) { dfs(x + 1, i); s -= f[x + 1][i];///------号 vis[i] = 0; } } } int main() { cin>>n; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) cin>>f[i][j]; } memset(vis, 0, sizeof(vis)); dfs(0, 0); cout<<sum<<endl; return 0; }