dh-winternagi 님의 블로그
(14889) 스타트와 링크 본문
https://www.acmicpc.net/problem/14889
단계별로 풀어보기
20단계(백트래킹) 8번째
이것도 결국 백트래킹으로 구하고 싶은 건 N까지의 수 중 N/2개를 순서 상관 없이 뽑는 경우이다. 점수차를 계산하는 부분이 조금 비효율적이긴 하지만 충분하다고 생각한다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, minval= 10000;
cin >> n;
vector abil(n, vector<int> (n));
vector<int> check(n), v;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin >> abil[i][j];
}
}
auto calc= [&](){
vector<int> v2;
for(int i=0;i<n;i++){
if(find(v.begin(),v.end(),i)==v.end()){
v2.push_back(i);
}
}
int sum=0, sum2=0;
for(int i=0;i<n/2-1;i++){
for(int j=i+1;j<n/2;j++){
sum+= abil[v[i]][v[j]]+abil[v[j]][v[i]];
sum2+= abil[v2[i]][v2[j]]+abil[v2[j]][v2[i]];
}
}
minval= min(minval, abs(sum-sum2));
};
auto func= [&](auto self, int depth) -> void {
if(depth==n/2){
calc();
return;
}
for(int i=v.empty()?0:v.back()+1;i<n;i++){
if(check[i]) continue;
check[i]= true;
v.push_back(i);
self(self, depth+1);
check[i]= false;
v.pop_back();
}
};
func(func, 0);
cout << minval;
return 0;
}'백준 (C++) > Solve' 카테고리의 다른 글
| (9184) 신나는 함수 실행 (0) | 2026.04.17 |
|---|---|
| (24416) 알고리즘 수업 - 피보나치 수 1 (0) | 2026.04.17 |
| (14888) 연산자 끼워넣기 (0) | 2026.04.17 |
| (2580) 스도쿠 (0) | 2026.04.17 |
| (9663) N-Queen (0) | 2026.04.17 |
