문제 출저
https://www.acmicpc.net/problem/15661
15661번: 링크와 스타트
첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100
www.acmicpc.net
문제 풀이
백트래킹을 통해 팀을 정합니다. 각 팀의 능력치를 합해서 최소값을 구합니다.
소스 코드
package baekjoon.year24.month3.day1120.day12;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
링크와 스타트
https://www.acmicpc.net/problem/15661
2의 10승 = 1024
10! = 3628800
3,715,891,200 = 37억
근데 합격된다 왜지..?
*/
public class B15661 {
static int n;
static int[][] board;
static boolean[] selected ;
static int answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
board = new int[n][n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
selected = new boolean[n];
answer = Integer.MAX_VALUE;
dfs(0);
System.out.println(answer);
}
public static void dfs(int stage) {
if (stage == n) {
int start = 0;
int link = 0;
for (int i = 0; i < n-1; i++) {
for (int j = i + 1; j < n; j++) {
if (selected[i] == selected[j]) {
if (selected[i] == true) {
start += board[i][j] + board[j][i];
}
else {
link += board[i][j] + board[j][i];
}
}
}
}
int result = Math.abs(start - link);
answer = Math.min(answer, result);
return;
}
selected[stage] = true;
dfs(stage+1);
selected[stage] = false;
dfs(stage+1);
}
}