Untitled

 avatar
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...