#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const ll mod = 1000000007; #define rep(i,n) for(int i=0;i=0;i--) #define all(x) (x).begin(),(x).end() int main() { int N; cin >> N; vector> X(N, vector(N)); rep(i, N) rep(j, N) cin >> X[i][j]; vector A(N); rep(i, N) cin >> A[i]; //申し訳なさの合計の最小値 //各Aが10^5、Nが18なので、10^7を超えない //※全員自白したと嘘をつけば、 ll sum = 10000000; //bit全探索 //N人のうち、うそをつく人のビットを1とする。 rep(bit, (1 << N)) { vector L(N, false); vector C(N, false); rep(i, N) { L[i] = (bit & (1 << i)) == (1 << i); } //自白ありフラグ bool flg = true; while (flg) { flg = false; //自白するかチェック rep(i, N) { if (C[i]) continue; bool flg2 = true; rep(j, N) { //頼りにしている人が自白もしていないし嘘もついていなかったら、チェック終了 if (X[i][j] == 1 && !(L[j] || C[j])) { flg2 = false; break; } } //自白フラグON if (flg2) { flg = true; C[i] = true; } } } //全員が自白したかチェック bool allC = true; rep(i, N) { if (!C[i]) { allC = false; break; } } if (!allC) continue; //全員を自白できる組み合わせの場合、申し訳なさの計算 //自白させた場合は加算しない ll tmp = 0; rep(i, N) if (L[i]) tmp += A[i]; sum = min(sum, tmp); } cout << sum << endl; return 0; }