#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
 
int map[30][30];
int N;
int Min = 9999999;
 
void combination(int start[], int visited[], int idx, int cnt, int std)
{
    if(cnt == std + 1)
    {
        int startSum = 0;
        int linkSum = 0;
        
        int link[20];
        int linkCnt = 0;
        
        for(int i = 1; i <= N; i++)
        {
            if(visited[i] == 0)
            {
                link[++linkCnt] = i;
            }
        }
        
        for(int i = 1; i < cnt; i++)
        {
            for(int j = 1; j < cnt; j++)
            {
                startSum += map[start[i]][start[j]];
            }
        }
        
        for(int i = 1; i <= linkCnt; i++)
        {
            for(int j = 1; j <= linkCnt; j++)
            {
                linkSum += map[link[i]][link[j]];
            }
        }
        
        if(abs(startSum-linkSum) < Min)
        {
            Min = abs(startSum-linkSum);
        }
        
        return;
    }
    
    for(int i = idx; i <= N; i++)
    {
        start[cnt] = i;
        visited[i] = 1;
        combination(start, visited, i+1, cnt+1std);
        visited[i] = 0;
    }
}
 
int main(void)
{
//    freopen("B15661_input.txt", "r", stdin);
    
    scanf("%d"&N);
    
    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= N; j++)
        {
            scanf("%d"&map[i][j]);
        }
    }
    
    // 팀원이 최소 1명 ~ N/2명 
    for(int i = 1; i <= N/2; i++)
    {
        int start[20= {0};
        int visited[20= {0};
        combination(start, visited, 11, i);    
    }
    
    cout << Min;
    
    return 0;
}
cs

+ Recent posts