Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
2.5 kB
1
Indexable
import java.util.Scanner;

public class Solution {
	static int n;								// so mon do co san
	static int[] price = new int[20];
	static int m;								// so goi sale co san
	static int[][] sale = new int[30][20];		// mon do co trong tung goi sale
	static int[] salePrice = new int[30];		// gia sale tung goi
	static int need;							// so mon do can mua
	static int[] list = new int[20];			// danh sach can mua
	static int[] visit = new int[20];			// da mua
	static int bought;
	static int min;
	static int sum;
	
	static int match(int j){
		int count = 0;
		for (int i = 0; i < 20; i++){
			for (int k = 0; k < need; k++){
				if (sale[j][i] == list[k] && visit[list[k]] == 0){
					count++;
				}
			}
		}
		return count;
	}
	
	static void solve(int t, int g){
        if (sum > min){
            return;
        }
		if (t == need){
			min = sum < min ? sum : min;
			return;
		}
		for (int x = 0; x < 2; x++){
			if (x == 1){
				for (int i = 0; i < need; i++){
					if(visit[list[i]] == 0){
						visit[list[i]] = 1;
						sum += price[list[i]];
						solve(t+1, g);
						visit[list[i]] = 0;
						sum -= price[list[i]];
						break;
					}
				}
			}
			else{
				for (int j = g; j < m; j++){
					int mat = match(j);
					if (mat != 0){
						sum +=  salePrice[j];
						for (int k = 0; k < 20; k++){
							if (sale[j][k] == -1)	break;
							visit[sale[j][k]]++;
						}
						solve(t+mat, j);
						sum -=  salePrice[j];
						for (int k = 0; k < 20; k++){
							if (sale[j][k] == -1)	break;
							visit[sale[j][k]]--;
						}
					}
				}
			}
		}
		return;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner (System.in);
		int T = sc.nextInt();
		for (int tc = 1; tc <= T; tc++){
			
			n = sc.nextInt();
			min = 99999;
			sum = 0;
			for (int i = 0; i < 30; i++){
				for (int j = 0; j < 20; j++){
					sale[i][j] = -1;
					list[j] = -1;
				}
			}
			for (int i = 0; i < n; i++){
				price[i] = sc.nextInt();
			}
			m = sc.nextInt();
			for (int j = 0; j < m; j++){
				salePrice[j] = sc.nextInt();
				int a = sc.nextInt();
				for (int k = 0; k < a; k++){
					sale[j][k] = sc.nextInt()-1;
				}
			}


			need = sc.nextInt();
			for (int i = 0; i < need; i++){
				list[i] = sc.nextInt()-1;
			}
			solve(0, 0);
			System.out.println("#" + tc + " " + min);
		}
	}

}