https://www.acmicpc.net/problem/14889
#include <iostream>
#include <vector>
using namespace std;
int N;
bool checked[20] = { 0 };
int list[20] = { 0 };
int min_val = 987654321;
vector<vector<int>> v(21, vector<int>(21, 0));
void DFS(int cnt, int cur_i)
{
int a_sum = 0, b_sum = 0;
if (cnt == N / 2)
{
for (int i = 0; i < N; i++)
{
for (int j = i+1; j < N; j++)
{
if (i != j)
{
if (checked[i] && checked[j])
{
a_sum += v[i][j];
a_sum += v[j][i];
}
else if (!checked[i] && !checked[j])
{
b_sum += v[i][j];
b_sum += v[j][i];
}
}
}
}
if (min_val > abs(a_sum - b_sum))
{
min_val = abs(a_sum - b_sum);
}
}
for (int i = cur_i; i < N; i++)
{
if (!checked[i])
{
checked[i] = true;
list[cnt] = i;
DFS(cnt + 1, i + 1);
checked[i] = false;
}
}
}
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N;
for (int i = 0; i < N; i++)
{
int tmp;
for (int j = 0; j < N; j++)
{
cin >> tmp;
v[i][j] = tmp;
}
}
DFS(0, 0);
cout << min_val;
return 0;
}