dfs版本
倒着做

1
2
3
4
5
6
7
8
9
10
11
int dfs(int sta, int now) { // sta是当前的状态(二进制),now是当前的位置
if (~dp[sta][now]) return dp[sta][now];

int res = 0x3f3f3f3f;
for (int i = 0; i < n; i++) {
if (sta >> i & 1) {
res = min(res, dfs(sta ^ (1 << i), i) + (价值));
}
}
return dp[sta][now] = res;
}

正着做

1
2
3
4
5
6
7
for (int i = 1; i < (1 << n); i++) {
for (int j = 0; j < n; j++) {
if (i >> j & 1) {
dp[i] = min(dp[i], dp[i ^ (1 << j)] + (价值));
}
}
}