AcWing 91. 打卡+收藏题目
原题链接
中等
作者:
五道口预备技术员
,
2021-03-16 22:09:29
,
所有人可见
,
阅读 450
#include <iostream>
#include <cstring>
using namespace std;
const int N = 20;
int weight[N][N];
int f[1 << 20][N];
int main()
{
memset(f, 0x3f, sizeof(f));
int n;
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> weight[i][j];
/**
* 那些点没用过
* 当前处于那个点
* f[i][j] i记录点的使用情况,j记录当前的位置
* k: 上一个的位置
* 公式: f[i,j] = f[i^1<<j,k] + weight[k,j];
**/
f[1][0] = 0;
for(int i = 0; i < 1 << n; i++)
for(int j = 0; j < n ; j++) if(i >> j & 1) //i的j位为 1
for(int k = 0; k < n; k++) if( (i^1<<j) >> k & 1) //将i的j位置修改为零,且判断k位是否为 1
f[i][j] = min(f[i][j],f[i^1<<j][k] + weight[k][j]);
//f[i][j] = min(f[i][j],f(i(没用过),k) + k到j的权值。
cout<< f[(1 << n) - 1][n - 1] <<endl;
return 0;
}