import java.util.*;
public class Main {
static int[][] arr;
static int n;
static int[] visited;
static int min = Integer.MAX_VALUE;
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
arr = new int[n][n];
visited = new int[n];
for(int i = 0; i<n; i++) {
for(int j = 0; j<n; j++) {
arr[i][j] = scan.nextInt();
}
}
dfs(0, 0);
System.out.println(min);
}
public static void dfs(int index, int count) {
if(index >= n) return;
if(count > n/2) return;
if(count == n/2) {
int t1 = 0; int t2 = 0;
for(int i = 0; i<n; i++) {
if(visited[i] == 1) {
for(int j = 0; j<n; j++) {
if(visited[j] == 1)
t1 += arr[i][j];
}
}
else if(visited[i] == 0) {
for(int j = 0; j<n; j++) {
if(visited[j] == 0)
t2 += arr[i][j];
}
}
}
if(Math.abs(t1-t2) < min)
min = Math.abs(t1-t2);
return;
}
visited[index] = 1;
dfs(index+1, count+1);
visited[index] = 0;
dfs(index+1, count);
}
}
SW Expert Academy 의 요리사와 똑같은 문제다.
팀을 정확히 반으로 가르기 때문에 N/2의 팀원을 구한후에 팀 별로 점수를 계산하면 된다.
내가 1팀에 속했을 때와 0팀에 속했을 때로 재귀를 호출해가며 count가 N/2가 되면 각각 2팀으로 나누어졌다는 뜻이기에 서로 같은 숫자 (1, 0)을 가진 사람끼리 점수를 더해주면 된다.
'알고리즘 > 백준' 카테고리의 다른 글
[BaekJoon] 백준 1010번 다리놓기 (0) | 2020.09.14 |
---|---|
[BaekJoon] 백준 2775. 부녀회장이 될테야 (0) | 2020.09.14 |
[BaekJoon] 14892 백준 톱니바퀴 (0) | 2020.05.31 |
[BaekJoon] 백준 14890 경사로 (0) | 2020.05.30 |
[BaekJoon] 14888 백준 연산자 끼워넣기 (0) | 2020.05.27 |