提交时间:2024-11-01 15:17:23

运行 ID: 34007

#include <cstdio> #include <iostream> #include <vector> #include <tr2/dynamic_bitset> using namespace std; using i64 = long long; constexpr int INF = 0x3f3f3f3f; int n, mn = INF; vector<int> curr, ans; tr2::dynamic_bitset<> vis; vector<vector<int>> round, magic; void solve(int idx, int mana, int lst = -1, int rnd = 0) { if (mana < 0 || rnd > mn) return; else if (idx >= n) { if (mn > rnd) { mn = rnd; ans = curr; } return; } for (int i = 0; i < n; ++i) { if (vis[i]) continue; vis[i] = true; curr.emplace_back(i); solve(idx + 1, mana - (lst != -1 ? magic[lst][i] : 0), i, rnd + (lst != -1 ? round[lst][i] : 0)); curr.pop_back(); vis[i] = false; } } int main() { int m; scanf("%d %d", &n, &m); round.resize(n); magic.resize(n); vis.resize(n); curr.reserve(n); for (auto& row : round) { row.resize(n); for (int& x : row) cin >> x; } for (auto& row : magic) { row.resize(n); for (int& x : row) cin >> x; } solve(0, m); if (ans.empty()) puts("-1"); else { printf("%d\n", mn); for (int x : ans) printf("%d ", x + 1); } return 0; }