售货员的难题
题目背景
数据有更改
题目描述
某乡有 $n\ (2\le n\le 20)$ 个村庄,有一个售货员,他要到各个村庄去售货,各村庄之间的路程 $s\ (0<s<1000)$ 是已知的,且 $A$ 村到 $B$ 村与 $B$ 村到 $A$ 村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为 $1$,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。
输入格式
村庄数 $n$ 和各村之间的路程(均是整数)。
第一行,第 $i+1$ 行第 $j$ 个数代表村庄 $i$ 到 $j$ 的单向路径的路程。
输出格式
最短的路程。
样例 #1
样例输入 #1
3
0 2 1
1 0 2
2 1 0
样例输出 #1
3
include <bits/stdc++.h>
using namespace std;
int n;
int g[20][20], dp[1 << 20][20];
int main()
{
memset(dp, 0x3f, sizeof(dp));
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int val;
cin >> val;
g[i][j] = val;
}
}
dp[1][0] = 0;
for (int s = 1; s < (1 << n); s += 2)
{
for (int v = 0; v < n; v++)
{
if (!((s >> v) & 1))
continue;
for (int u = 0; u < n; u++)
{
if (v == u)
continue;
if (!((s >> u & 1)))
continue;
dp[s][v] = min(dp[s][v], dp[s ^ (1 << v)][u] + g[u][v]);
}
}
}
int ans = 1e9+7;
for (int i = 0; i < n; i++)
ans = min(ans, dp[(1 << n) - 1][i] + g[i][0]);
cout << ans;
return 0;
}
标签:20,val,int,状压,++,村庄,dp From: https://www.cnblogs.com/anlan-woaiyuanshen/p/18171201