Untitled
unknown
plain_text
2 years ago
1.7 kB
15
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...