nang cap may tinh
unknown
plain_text
2 years ago
2.6 kB
10
Indexable
package practise;
import java.util.Scanner;
public class nang_cap_may_tinh {
static int n_equip, n_sale, n_use, ans;
static int[] price_CT, price_sale, usage, bought;
static boolean[] visit;
static int[][] sales;
// private static boolean check() {
// for(int i = 0; i < n_use; i++) {
// if(bought[i] == -1) return false;
// }
// return true;
// }
private static void backtrack(int sale, int cnt, int price) {
if(cnt == n_use) {
ans = ans > price ? price : ans;
return;
}
if(sale == n_sale) {
int tmp = 0;
for(int i = 0; i < n_use; i++) {
if(bought[i] == -1) {
tmp += price_CT[usage[i]];
}
}
ans = ans > tmp + price ? tmp + price : ans;
return;
}
visit[sale] = true;
int sum = 0, tmp = 0;
for(int i = 0; i < n_use; i++) {
if(bought[i] == -1 && sales[sale][usage[i]] != 0) {
bought[i] = cnt;
tmp++;
sum += price_CT[usage[i]];
}
}
if(tmp != 0) {
if(sum > price_sale[sale]) {
backtrack(sale + 1, cnt + tmp, price + price_sale[sale]);
}
else backtrack(sale + 1, cnt + tmp, price + sum);
for(int i = 0; i < n_use; i++) {
if(bought[i] == cnt) bought[i] = -1;
}
}
else backtrack(sale + 1, cnt, price);
visit[sale] = false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int testcase = sc.nextInt();
for(int tc = 1; tc <= testcase; tc++) {
n_equip = sc.nextInt() + 1;
price_CT = new int[n_equip];
for(int i = 1; i < n_equip; i++) {
price_CT[i] = sc.nextInt();
}
n_sale = sc.nextInt() + 1;
sales = new int[n_sale][n_equip];
price_sale = new int[n_sale];
int equip, price, tmp;
for(int i = 1; i < n_sale; i++) {
price = sc.nextInt();
price_sale[i] = price;
equip = sc.nextInt();
for(int j = 0; j < equip; j++) {
tmp = sc.nextInt();
sales[i][tmp] = price;
}
}
n_use = sc.nextInt();
usage = new int[n_use];
bought = new int[n_use];
for(int i = 0; i < n_use; i++) {
usage[i] = sc.nextInt();
bought[i] = -1;
}
visit = new boolean[n_sale];
ans = Integer.MAX_VALUE;
if(n_sale == 1) {
ans = 0;
for(int i = 0; i < n_use; i++) {
ans += price_CT[usage[i]];
}
}
else {
for(int i = 1; i < n_sale; i++) {
backtrack(i, 0, 0);
}
}
// backtrack(1, 0, 0);
System.out.println("#" + tc + " " + ans);
// return;
}
}
}
Editor is loading...