Untitled
unknown
plain_text
a year ago
1.7 kB
8
Indexable
#include<stdio.h> #include<iostream> #define INF 999999 #define MAX_N 22 #define MAX_M 32 using namespace std; int n, m, k; int a[MAX_N][MAX_N]; int b[MAX_N]; int flag[MAX_N]; int need[MAX_N]; int pack[MAX_M + MAX_N][MAX_N + 2]; int res; int tmp_sum; bool check(){ for (int i = 0; i < n; i++){ if (flag[i] == 0) return false; } return true; } bool shouldnt(int x){ for (int i = 0 ; i < pack[x][1]; i++){ if (flag[pack[x][2 + i]] == 0) return false; } return true; } void search(int x){ if (tmp_sum >= res) return; if (check()){ res = min(res, tmp_sum); return; } if (x == n + m){ return; } if (!shouldnt(x)){ tmp_sum += pack[x][0]; for (int i = 0 ; i < pack[x][1]; i++){ flag[pack[x][2 + i]]++; } search(x + 1); tmp_sum -= pack[x][0]; for (int i = 0 ; i < pack[x][1]; i++){ flag[pack[x][2 + i]]--; } } search(x + 1); } int main(){ freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int t; cin >> t; int tc = 1; while (t--){ //reset res = INF; tmp_sum = 0; cin >> n; for (int i = 0; i < n; i++){ cin >> pack[i][0]; pack[i][1] = 1; pack[i][2] = i; } for (int i = 0; i < n; i++){ flag[i] = 1; } cin >> m; for (int i = n; i < n + m; i++){ cin >> pack[i][0] >> pack[i][1]; for (int j = 2; j < pack[i][1] + 2; j++){ cin >> pack[i][j]; pack[i][j]--; } } cin >> k; for (int i = 0; i < k; i++){ cin >> need[i]; flag[need[i] - 1] = 0; } search(0); printf("#%d %d\n", tc++, res); } return 0; }
Editor is loading...