Study hard
(c++)백준 14889번: 스타트와 링크 본문
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
[풀이]
dfs 조합으로 모든 경우의 수를 탐색하는 문제였다.
매 경우의 수마다 스타트 팀과 링크 팀의 능력치 차를 계산하여 최소값을 갱신한다.
#include <iostream>
#include <algorithm>//min
#include <cstdlib>//abs
using namespace std;
int N;
int S[21][21];
bool Select[21];//스타트 팀에 속한 사람
int totalS = 0;
int Min = 987654321;
void getDiff() {
int Start = 0;
int Link = 0;
for (int i = 1; i <= N; i++) {
if (Select[i] == true) {
for (int j = 1; j <= N; j++) {
if (i == j)
continue;
if (Select[j] == true) {
Start += S[i][j];
}
}
}
}
for (int i = 1; i <= N; i++) {
if (Select[i] == false) {
for (int j = 1; j <= N; j++) {
if (i == j)
continue;
if (Select[j] == false) {
Link += S[i][j];
}
}
}
}
int diff = abs(Start - Link);
Min = min(Min, diff);
}
void setStart(int idx, int cnt) {
if (cnt == N / 2) {
getDiff();
return;
}
for (int i = idx; i <= N; i++) {
if (Select[i] == true)
continue;
Select[i] = true;
setStart(i, cnt + 1);
Select[i] = false;
}
}
void solution() {
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> S[i][j];
}
}
setStart(1, 0);
cout << Min << '\n';
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
solution();
return 0;
}
'백준 > bfs, dfs' 카테고리의 다른 글
(c++)백준 16236번: 아기 상어 (0) | 2020.10.17 |
---|---|
(c++)백준 17142번: 연구소 3 (0) | 2020.10.17 |
(c++)백준 15684번: 사다리 조작 (0) | 2020.10.16 |
(c++)백준 12100번: 2048 (Easy) (0) | 2020.10.16 |
(c++)백준 13460번: 구슬 탈출 2 (0) | 2020.10.16 |