Nâng cấp máy tính (Thuật toán quay lui)
package Advance;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ComputerUpgrade {
int N, M;
int Answer;
int Package[][];
int Value[];
int visit[];
int Subset[];
int SLM;
int min;
public static void main(String[] args) throws Exception {
new ComputerUpgrade().begin();
}
private void begin() throws Exception {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int test_case = 1; test_case <= T; test_case++) {
Answer = 0;
N = sc.nextInt();
Package = new int[51][51];
Value = new int[51];
min = 100000000;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j) {
Package[i][j] = 1;
Value[i] = sc.nextInt();
}
}
}
M = sc.nextInt();
for (int i = N + 1; i <= M + N; i++) {
Value[i] = sc.nextInt();
int sl = sc.nextInt();
for (int j = 0; j < sl; j++) {
int index = sc.nextInt();
Package[i][index] = 1;
}
}
SLM = sc.nextInt();
visit = new int[N + 1];
for (int i = 0; i < SLM; i++) {
int index = sc.nextInt();
visit[index] = 1;
}
Subset = new int[N + M + 1];
back(1, 0, visit);
System.out.println("#" + test_case + " " + min);
}
}
private void back(int i, int gia, int mua[]) {
if (muaxong(mua)) {
if (gia < min) {
min = gia;
Answer = gia;
}
return;
}
if (i == N + M + 1) {
return;
}
if (check(i, gia)) {
Subset[i] = 1;
int temp[] = new int[N + 1];
for (int j = 1; j <= N; j++) {
temp[j] = mua[j];
if (Package[i][j] == 1) {
temp[j] = 0;
}
}
back(i + 1, gia + Value[i], temp);
}
Subset[i] = 0;
back(i + 1, gia, mua);
}
private boolean muaxong(int vs[]) {
for (int i = 1; i <= N; i++) {
if (vs[i] == 1) {
return false;
}
}
return true;
}
private boolean check(int j, int gia) {
if (gia + Value[j] >= min)
return false;
for (int i = 1; i <= N; i++) {
if (Package[j][i] == 1 && visit[i] == 1) {
return true;
}
}
return false;
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ComputerUpgrade {
int N, M;
int Answer;
int Package[][];
int Value[];
int visit[];
int Subset[];
int SLM;
int min;
public static void main(String[] args) throws Exception {
new ComputerUpgrade().begin();
}
private void begin() throws Exception {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int test_case = 1; test_case <= T; test_case++) {
Answer = 0;
N = sc.nextInt();
Package = new int[51][51];
Value = new int[51];
min = 100000000;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j) {
Package[i][j] = 1;
Value[i] = sc.nextInt();
}
}
}
M = sc.nextInt();
for (int i = N + 1; i <= M + N; i++) {
Value[i] = sc.nextInt();
int sl = sc.nextInt();
for (int j = 0; j < sl; j++) {
int index = sc.nextInt();
Package[i][index] = 1;
}
}
SLM = sc.nextInt();
visit = new int[N + 1];
for (int i = 0; i < SLM; i++) {
int index = sc.nextInt();
visit[index] = 1;
}
Subset = new int[N + M + 1];
back(1, 0, visit);
System.out.println("#" + test_case + " " + min);
}
}
private void back(int i, int gia, int mua[]) {
if (muaxong(mua)) {
if (gia < min) {
min = gia;
Answer = gia;
}
return;
}
if (i == N + M + 1) {
return;
}
if (check(i, gia)) {
Subset[i] = 1;
int temp[] = new int[N + 1];
for (int j = 1; j <= N; j++) {
temp[j] = mua[j];
if (Package[i][j] == 1) {
temp[j] = 0;
}
}
back(i + 1, gia + Value[i], temp);
}
Subset[i] = 0;
back(i + 1, gia, mua);
}
private boolean muaxong(int vs[]) {
for (int i = 1; i <= N; i++) {
if (vs[i] == 1) {
return false;
}
}
return true;
}
private boolean check(int j, int gia) {
if (gia + Value[j] >= min)
return false;
for (int i = 1; i <= N; i++) {
if (Package[j][i] == 1 && visit[i] == 1) {
return true;
}
}
return false;
}
}
Nhận xét
Đăng nhận xét