#include #define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i)) #define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i)) using namespace std; template inline void chmin(T & a, U const & b) { a = min(a, b); } int solve(int n, const vector & g, const vector & a) { vector dp(1 << n, INT_MAX); dp[0] = 0; REP3 (s, 1, 1 << n) { REP (i, n) if (s & (1 << i)) { int t = s ^ (1 << i); if (dp[t] == INT_MAX) continue; chmin(dp[s], dp[t] + ((g[i] | t) == t ? 0 : a[i])); } } return dp.back(); } int main() { int n; cin >> n; vector g(n); REP (y, n) REP (x, n) { int z; cin >> z; if (z) { g[y] |= (1 << x); } } vector a(n); REP (i, n) { cin >> a[i]; } cout << solve(n, g, a) << endl; return 0; }