3월 3일(금) - 백트랙킹 - 14889번
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이
(참고 -> https://icanyoucanwecan.tistory.com/76 )
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
#define MAX 987654321
int visit[21];
int map[22][22];
int N, MIN;
int abs(int a)
{
return a < 0 ? -1 * a : a;
}
void DFS(int cur, int n)
{
if (n == N / 2)
{
int team_1 = 0;
int team_2 = 0;
int team_bal = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (visit[i] == 1 && visit[j] == 1)
{
team_1 += map[i][j];
}
else if (visit[i] == 0 && visit[j] == 0)
{
team_2 += map[i][j];
}
}
}
team_bal = abs(team_1 - team_2);
if (MIN > team_bal)
{
MIN = team_bal;
}
return;
}
for (int i = cur + 1; i < N; i++)
{
visit[i] = 1;
DFS(i, n + 1);
visit[i] = 0;
}
return;
}
int main(void)
{
MIN = MAX;
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%d", &map[i][j]);
}
}
for (int i = 0; i < N; i++)
{
visit[i] = 1;
DFS(i, 1);
visit[i] = 0;
}
printf("%d\n", MIN);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(C언어) > 23년 3월' 카테고리의 다른 글
[C] 백준 - 9184번: 신나는 함수 실행 (0) | 2023.03.06 |
---|---|
동적 계획법 1 - 24416번 (0) | 2023.03.06 |
반복문 - 25314번 (0) | 2023.03.02 |
(*풀이진행중)백트랙킹 - 14889번 (0) | 2023.03.02 |
백트랙킹 - 14888번 (0) | 2023.03.01 |
댓글