#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define INF (1<<29) #define rep(i,n) for(int i=0;i<(int)(n);i++) #define all(v) v.begin(),v.end() #define uniq(v) v.erase(unique(all(v)),v.end()) int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int x[18][18]; rep(i, n)rep(j, n)cin >> x[i][j]; int bmask[18] = {}; rep(i,n) { rep(j, n)bmask[i] |= x[i][j] << j; } int a[18]; rep(i, n)cin >> a[i]; int ans = INF; rep(b, 1 << n) { bool zihaku[18] = {}; int cost = 0; int cnt = 0; int done = b; rep(i, n)if (b >> i & 1) { cost += a[i]; } if (cost >= ans)continue; while (cnt < n) { bool update = false; rep(i, n) if (!zihaku[i] && (bmask[i] & done) == bmask[i]) { zihaku[i] = true; done |= 1 << i; cnt++; update = true; } if (!update)break; } if(cnt == n) ans = cost; } cout << ans << endl; return 0; }