题目解析、自码代码待编辑
核心代码
//输入 int n; int d[MAX_N][MAX_N]; int dp[1 << MAX_N][MAX_N]; //记忆化搜索使用的 DP数组 //已经访问过的顶点集合为 S,当前位置为 v int rec(int S, int v) { if (dp[S][v] >= 0) return dp[S][v]; if (S == (1 << n) - 1 && v == 0){ //已访问过所有顶点并回到 0号起点 return dp[S][v] = 0; } int res = INF; //无穷大值 for (int u = 0; u < n; u++){ if (!(S >> u & 1)) { res = min(res,rec(S | 1 << u, u) + d[v][u]); } } return dp[S][v] = res; } void solve() { memset(dp, -1, sizeof(dp)); cout << rec(0,0); }