순열, dfs 모두 가능

bm을 이용해 dfs로 풀었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <algorithm>
using namespace std;
 
int n, s[20][20], ans = 2e9;
 
void solve(int bm, int x, int cnt) {
    if (cnt > n / 2 || x >= n) return;
    if (cnt == n / 2) {
        int sum[2= { 0, }, b[20];
        for (int i = 0; i < n; i++) b[i] = bm&(1 << i) ? 1 : 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (b[i] != b[j]) continue;
                sum[b[i]] += s[i][j];
                sum[b[i]] += s[j][i];
            }
        }
        ans = min(ans, abs(sum[0- sum[1]));
        return;
    }
    solve(bm | (1 << x), x + 1, cnt + 1);
    solve(bm, x + 1, cnt);
}
 
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++for (int j = 0; j < n; j++)
        scanf("%d"&s[i][j]);
    solve(000);
    printf("%d", ans);
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

14891 톱니바퀴  (0) 2017.10.26
14890 경사로  (0) 2017.10.26
14888 연산자 끼워넣기  (0) 2017.10.26
14648 쿼리 맛보기  (0) 2017.10.03
8068 Water  (0) 2017.10.03

+ Recent posts