#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<set>
#include<cstdlib>
#include<sstream>
using namespace std;
int a[1000][1000];
int p[1001];
int n;
vector<int> first;;
vector<int>second;
long long real = 100000000;
bool check() {
return true;
}
void solve(int cnt ) {
// 양쪽 반씩 뽑았을 때
// 반씩 중에서 확인
//예외의 경우
//둘 중 하나 n/2 보다 큰 경우
if (first.size() > n / 2) return;
if (second.size() > n / 2) return;
if (cnt == n+1) {
if (check()) {
long long sum1 = 0;
long long sum2 = 0;
for (int i = 0; i < first.size(); i++) {
for (int j = i + 1; j < first.size(); j++) {
sum1 += a[first[i]][first[j]];
sum1 += a[first[j]][first[i]];
}
}
for (int i = 0; i < first.size(); i++) {
for (int j = i + 1; j < first.size(); j++) {
sum2 += a[second[i]][second[j]];
sum2 += a[second[j]][second[i]];
}
}
real = min(abs(sum1-sum2), real);
}
return;
}
if (cnt > n + 1) return;
// 반씩 안뽑았다..
// 그럼 뽑아줌.
first.push_back(cnt);
solve(cnt + 1);
first.pop_back();
second.push_back(cnt);
solve(cnt + 1);
second.pop_back();
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
solve(1);
cout << real;
return 0;
# }
여름방학 때까지만 해도 코드를 이해하지도 못했는데 이제 스스로 구현할 수 있다니!! 뿌듯하당 ㅠㅠㅠ