Algorithm/백준

[백준][14889번] 스타트와 링크

1일1코딩 2020. 4. 23. 23:01

https://www.acmicpc.net/problem/14889

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

풀이과정

1. 완전탐색을 이용했다.

 

2. 팀을 나눈 후 각 점수를 더해 최솟값이 되는 점수를 구하면 된다.

 

소스코드

더보기
#include <stdio.h>
#include <stdlib.h>
int map[20][20];
int user[20];
int N;
int answer = 0x7fffffff;
void solution(int cur, int count) {
	if (count == N/2) {
		int result = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (i == j) continue;
				if (user[i] == user[j]) {
					result = (user[i] == 0) ? result + map[i][j] : result - map[i][j];
				}
			}
		}
		result = abs(result);
		if (answer > result) {
			answer = result;
		}
		return;
	}

	for (int i = cur; i < N; i++) {
		if (user[i] == 0) {
			user[i] = 1;
			solution(i + 1, count + 1);
			user[i] = 0;
		}
	}
}

int main()
{
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			scanf("%d", &map[i][j]);
		}
	}
	solution(0, 0);
	printf("%d\n", answer);
}

 

결과