/* -*- coding: utf-8 -*- * * 943.cc: No.943 取り調べ - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 18; const int NBITS = 1 << MAX_N; const int INF = 1 << 30; /* typedef */ /* global variables */ int xbs[MAX_N], as[MAX_N], asums[NBITS]; /* subroutines */ bool check(int n, int bits) { for (int i = 0; i < n; i++) for (int j = 0, bj = 1; j < n; j++, bj <<= 1) if ((bits & xbs[j]) == xbs[j]) bits |= bj; return (bits == (1 << n) - 1); } /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) for (int j = 0, bj = 1; j < n; j++, bj <<= 1) { int x; scanf("%d", &x); if (x) xbs[i] |= bj; } for (int i = 0; i < n; i++) scanf("%d", as + i); int nbits = 1 << n; for (int bits = 1, msb = 1, bi = 0; bits < nbits; bits++) { if ((msb << 1) <= bits) msb <<= 1, bi++; asums[bits] = asums[bits ^ msb] + as[bi]; } int minsum = INF; for (int bits = 0; bits < nbits; bits++) if (check(n, bits) && minsum > asums[bits]) minsum = asums[bits]; printf("%d\n", minsum); return 0; }