https://pintia.cn/problem-sets/1328156631236235264/problems/1328156672017461249
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int n,c[20][20];
//将工作i分配给第j个人所需要的费用
//每个人分配到一个对应的工作,n个工作分别分配给n个人
int vis[20];
//vis数组标记已经被分配了的工作,不重复分配
int ans=inf,sum=0;
//求最小费用,ans初始化为无穷大
//sum初始化为0,在计算回溯的过程中,回溯到最开始的点时自动为0
void dfs(int x,int y){
sum+=c[x][y];
vis[y]=1;
if(sum>ans) return;
//如果当前的费用已经超过已知解的费用,不需要再往下计算了
if(x==n){
ans=min(ans,sum);
return;
}
for(int j=1;j<=n;j++){
if(!vis[j]){
dfs(x+1,j);
sum-=c[x+1][j];
vis[j]=0;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
}
}
dfs(0,0);
cout<<ans<<endl;
return 0;
}