題目鏈接
題解:這題就是普通的狀壓dp 設 二維dp[i][j] 表示爲 在i狀態下 物品在第j個人手上的最小代價花費。
初始化要注意一下。
#include<bits/stdc++.h>
using namespace std;
const int N = 20, M = (1 << 17);
int dp[M][N], mp[N][N];
int main()
{
int n, mx;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &mp[i][j]);
mx = (1 << n);
memset(dp, 0x3f, sizeof dp);
for(int i = 0; i < n; ++i)
dp[1<<i][i] = 0;
for(int i = 0; i < mx; ++i)
for(int j = 0; j < n; ++j)
if(((1<<j) & i)==0)
for(int z = 0; z < n; ++z)
if(j != z &&((1 << z) & i))
dp[i^(1<<j)][j] = min(dp[i^(1<<j)][j], dp[i][z] + mp[z][j]);
int ans = 1e9;
for(int i = 0; i < n; ++i)
ans = min(ans, dp[mx - 1][i]);
printf("%d\n", ans);
}