static int table[16][16];
static int N;
static int __solution(int s, int sel_bit, int cnt)
{
if (cnt == N / 2)
{
vector<int> grp[2];
for (int i = 0; i < N; i++)
{
if (sel_bit & 1 << i)
grp[1].push_back(i);
else
grp[0].push_back(i);
}
int val[] = { 0, 0 };
for (int g = 0; g < 2; g++)
{
for (int i = 0; i < cnt; i++)
{
int y = grp[g][i];
for (int j = i + 1; j < cnt; j++)
{
int x = grp[g][j];
val[g] += (table[y][x] + table[x][y]);
}
}
}
return (val[0] > val[1] ? val[0] - val[1] : val[1] - val[0]);
}
int min = 0x7FFFFFFF;
for (int start = s + 1; start < N; start++)
{
int ret = __solution(start, sel_bit | 1 << (start), cnt + 1);
if (ret < min)
min = ret;
}
return min;
}
...