문제 : https://www.acmicpc.net/problem/14889


[알고리즘풀이]

백트레킹 기법을 이용하여, ( N / 2 ) 명을 뽑는 모든 경우의 수에 대해 Team 능력치를 구하고, 차이를 계산한다.

#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>

using namespace std;

int m = 1000000000, n;
int map[20][20];

void bt(int, int, vector<int>);

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			cin >> map[i][j];
	vector<int> v;
	for (int i = 0; i < n / 2; i++) {
		v.push_back(i);
		bt(1, i, v);
		v.pop_back();
	}
	cout << m;
}

void bt(int k, int l, vector<int> v) {
	if (k == n / 2) {
		int t1 = 0, t2 = 0;
		bool c[20] = {};
		for (int i = 0; i < v.size(); i++)
			c[v[i]] = true;
		vector<int> v2;
		for (int i = 0; i < n; i++)
			if (c[i] == false)
				v2.push_back(i);
		
		for (int i = 0; i < v.size(); i++)
			for (int j = 0; j < v.size(); j++)
					t1 += map[v[i]][v[j]];

		for (int i = 0; i < v2.size(); i++)
			for (int j = 0; j < v2.size(); j++)
					t2 += map[v2[i]][v2[j]];
		if (abs(t1 - t2) < m)
			m = abs(t1 - t2);
		return;
	}

	for (int i = l + 1; i < n; i++) {
		v.push_back(i);
		bt(k + 1, i, v);
		v.pop_back();
	}
	return;
}

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 1212 - 8진수 2진수  (0) 2019.09.23
[BOJ] 4355 - Relatives  (2) 2019.09.23
[BOJ] 14888 - 연산자 끼워넣기  (0) 2019.09.21
[BOJ] 2580 - 스도쿠  (0) 2019.09.21
[BOJ] 2981 - GRANICA  (0) 2019.09.21

+ Recent posts