Description
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为 cij。试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小。
设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。
Input
输入数据的第一行有1 个正整数n (1≤n≤11)。接下来的n行,每行n个数,表示工作费用。
Output
将计算出的最小总费用输出。
Samples
Sample #1
Input
3 10 2 3 2 3 4 3 4 5
Output
9
#include<bits/stdc++.h>
using namespace std;
int a[30][30],n,minn=0x3f3f3f3f,sum=0;
bool t[30];
void dfs(int m){
//当访问完所有的顶点时,如果当前路径的长度小于 minn,则更新 minn 的值,并返回
if(m>=n){
if(minn>sum){
minn=sum;
return ;
}
}
for(int i=0;i<n;i++){
if(!t[i]){//如果顶点 i 没有被访问过
t[i]=1;
sum+=a[m][i];
//如果当前路径长度 sum 小于最小路径长度 minn,则递归调用 dfs(m+1),继续向下一层搜索
if(minn>sum)
dfs(m+1);
t[i]=0;//递归调用结束后,将顶点i标记为未访问
sum-=a[m][i];
//将从当前顶点 m 到顶点 i 的边权值从当前路径长度sum中减去
}
}
}
int main() {
cin>>n;
for(int i=0;i<n;i++){
t[i]=0;
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
dfs(0);
cout<<minn<<endl;
return 0;
}