[BOJ][실3][14889] 스타트와 링크
문제 링크
첫 번째 풀이 : DFS
알고리즘
n명을 두 팀으로 나누어야 합니다. A팀 n/2명을 고르는 백트래킹을 진행합니다. B팀에는 우선 모든 인원을 넣어두고, A팀의
정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int arr[25][25];
int team[25];
vector<int> teamB;
int ans = 987654321;
void recur(int depth, int start) {
if (depth == n / 2) {
vector<int> copy(teamB);
for (int i = 0; i < depth; i++) {
auto it = find(copy.begin(), copy.end(), team[i]);
copy.erase(it);
}
/*cout << "teamA teamB\n";
for (int i = 0; i < depth; i++) {
cout << team[i] << " " << copy[i] << "\n";
}*/
int a = 0, b = 0;
for (int i = 0; i < n / 2; i++) {
for (int j = i+1; j < n / 2; j++) {
a += arr[team[i]][team[j]];
a += arr[team[j]][team[i]];
b += arr[copy[i]][copy[j]];
b += arr[copy[j]][copy[i]];
}
}
ans = min(ans, abs(a - b));
return;
}
for (int i = start; i < n; i++) {
team[depth] = i;
recur(depth + 1, i + 1);
}
}
int main()
{
//freopen("input.txt", "r", stdin);
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
teamB.push_back(i);
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
}
}
recur(0, 0);
cout << ans;
return 0;
}
Success Notice: 수고하셨습니다.
Leave a comment