Untitled

 avatar
unknown
plain_text
2 years ago
1.1 kB
2
Indexable
#include<iostream>
using namespace std;

int n,m,p,l;
int a[100],b[100],c[100][100],d[100];
int ans;
int vs[100];
int x[100];
void backtrack(int num, int sum)
{
	if (num == m+1) 
	{
		for (int i = 1; i<=n; i++) vs[i] = 0;
		for (int i=1; i<=m; i++) 
			if (x[i] == 1)
			{
				for (int j=1; j<=c[i][0]; j++) vs[c[i][j]] = 1;
			}
		for (int i=1; i<=l; i++)
			if (vs[d[i]] == 0) sum+=a[d[i]];
		if (ans > sum) ans = sum;
		return;
	}
	x[num] = 0; backtrack(num+1,sum);
	x[num] = 1; 
		if (sum >= ans) return;
		else backtrack(num+1, sum+b[num]);
}


int main()
{
//	freopen("input.txt","r",stdin);
	int t;
	cin >> t;
	for (int tc=1; tc<=t; tc++)
	{
		ans = 0;
		cin >> n;
		for (int i=1; i<=n; i++) cin >> a[i];
		cin >> m;
		for (int i=1; i<=m; i++)
		{
			cin >> b[i];
			cin >> c[i][0];
			for (int j=1; j<=c[i][0]; j++) cin >> c[i][j];
		}
		cin >> l;
		for (int i=1; i<=l; i++)
		{
			cin >> d[i];
			ans+= a[d[i]];
		}
		backtrack(1,0);
		cout << "#" << tc << " " << ans << endl;


	}

}