/* ID: espr1t LANG: C++ TASK: Demo KEYWORDS: */ #include #include #include #include #include #include #include #include #include #include #include #define MAX 64 #define MASK 16384 #define INF 1000000000000000LL using namespace std; FILE *in; FILE *out; long long dyn[MAX][MASK][2]; int n, m; int delivery[MAX]; long long ma3x[MAX][MAX]; int firstBit[MASK]; long long recurse(int idx, int mask, int used) { if (mask == (1 << m) - 1) return 0; if (idx >= n) return INF; if (dyn[idx][mask][used] != -1) return dyn[idx][mask][used]; long long ans = recurse(idx + 1, mask, 0); int nmask = mask; while (firstBit[nmask] < m) { if (ma3x[idx][firstBit[nmask]] != -1 && (mask & (1 << firstBit[nmask])) == 0) ans = min(ans, recurse(idx, mask | (1 << firstBit[nmask]), 1) + ma3x[idx][firstBit[nmask]] + (used ? 0 : delivery[idx])); nmask |= (1 << firstBit[nmask]); } return dyn[idx][mask][used] = ans; } string toString(long long num) { if (num == 0) return "0"; string ret; while (num) {ret.push_back(num % 10 + 48); num /= 10;} reverse(ret.begin(), ret.end()); return ret; } int main(void) { in = stdin; out = stdout; in = fopen("materials.in", "rt"); out = fopen("materials.out", "wt"); // unsigned sTime = clock(); fscanf(in, "%d %d", &n, &m); for (int i = 0; i < n; i++) fscanf(in, "%d", &delivery[i]); memset(ma3x, -1, sizeof(ma3x)); for (int i = 0; i < n; i++) { int size; fscanf(in, "%d", &size); for (int c = 0; c < size; c++) { int item; unsigned cost; fscanf(in, "%d %u", &item, &cost); ma3x[i][item - 1] = cost; } } memset(firstBit, 0, sizeof(firstBit)); for (int mask = 0; mask < (1 << 14); mask++) { firstBit[mask] = 0; while (mask & (1 << firstBit[mask])) firstBit[mask]++; } memset(dyn, -1, sizeof(dyn)); fprintf(out, "%s\n", toString(recurse(0, 0, 0)).c_str()); // fprintf(stderr, "Exec time: %.3lf\n", (double)(clock() - sTime) / CLOCKS_PER_SEC); // system("pause"); return 0; }