旅行商问题求条

P1171

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, dis[25][25], ans = LLONG_MAX;
int dp[1048580][25];
signed main() {
	memset(dp, 0x3f, sizeof dp);
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> dis[i][j];
		}
	} 
	dp[1][0] = 0;
	for (int i = 1; i < (1 << n); i++) {
		for (int j = 0; j < n; j++) {
			if (i & (1 << j)) {
				for (int k = 0; k < n; k++) {
					if ((i & (1 << k)) == 0) dp[(1 << k) | i][k] = min(dp[(1 << k) | i][k], dp[i][j] + dis[j][k]);
 				}
			}
		}
	}
	for (int i = 0; i < n; i++) ans = min(ans, dp[(1 << n) - 1][i]);
	cout << ans;
	return 0;
}

你好,我看看,稍等 :rose:

你好,你这个最后的ans取得有点问题,他默认是从1商店回到1商店,你的状态转移是对的,但是中间那个循环求不了dp[(1<<n)-1][0],(因为(1<<n)-1会发现已经有0了),所以你最后求ans的时候应该for(int i=1;i<n;i++)
{
ans=min(ans,dp[(1<<n)-1][i]+dis[i][0]);
}

刚试了一下,过了

谢谢老师

1 个赞

:rose: :rose: