알고리즘/백트래킹

[백준/백트래킹/C++] 14889번 스타트와 링크 (삼성 SW 역량 테스트 기출)

데메즈 2023. 1. 13. 15:23
728x90
반응형

문제집: 삼성 SW 역량 테스트 기출 문제 (baekjoon)

www.acmicpc.net

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

#include <iostream>
#include <vector>

using namespace std;
int ss[21][21];
int n;
bool isused[21];
int result = 2e9;

void count(){
    vector<int> s, l;
    int stot = 0, ltot = 0;

    for(int i=1; i<=n; i++){ // 스타트팀, 링크팀 나누기
        if(isused[i]) s.push_back(i);
        else l.push_back(i);
    }

    for(int i=0; i<s.size()-1; i++){ // 스타트팀 능력치 합
        for(int j=i+1; j<s.size(); j++){
            stot = stot + ss[s[i]][s[j]] + ss[s[j]][s[i]];
        }
    }

    for(int i=0; i<l.size()-1; i++){ // 링크팀 능력치 합
        for(int j=i+1; j<l.size(); j++){
            ltot = ltot + ss[l[i]][l[j]] + ss[l[j]][l[i]];
        }
    }

    result = min(result, abs(stot - ltot));
}

void divide(int k, int tot){ // 스타트팀에 k번 포함, tot명수
    if(tot==n/2){
        count();
        return;
    }
    for(int i=k+1; i<=n; i++){
        isused[i] = true;
        divide(i, tot+1);
        isused[i] = false;
    }
}

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

    cin >> n;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cin >> ss[i][j];
        }
    }

    for(int i=1; i<n; i++){
        divide(i, 0);
    }
    cout << result;

    return 0;
}
728x90
반응형