算法:记忆化dfs+状态压缩
#include<bits/stdc++.h>
using namespace std;
int n, f[110][110], a[110][110], ans = INT_MAX, s[(1 << 20) + 5][21];
void dfs(int x, int k, int dis)
{
s[k][x] = dis;
if (k == (1 << n) - 1)
ans = min(ans ,dis + a[x][1]);
if (k == (1 << n) - 1)return;
if(dis > ans)
return;
if(s[k ^ ((1 << n) - 1)][x] > 0)
{
ans = min(s[k ^ ((1 << n) - 1)][x] + dis, ans);
return;
}
for(int i = 1; i <= n; i++)
{
if(i == x)
continue;
if(k & (1 << (i - 1)))
continue;
dfs(i, k | (1 << (i - 1)), dis + a[x][i]);
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", a[i] + j);
dfs(1, 0, 0);
cout <<ans;
}