만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

송금

면접 대비

시간 제한1초메모리 제한1024 MB

요약
친구 N명의 채무 행렬이 주어질 때, 모든 사람의 잔액을 0으로 만드는 최소 송금 횟수를 구합니다.
난이도

보통10점 중 6점

유형
동적 계획법, 비트 연산
정답자
아직 제출이 없습니다

문제

NN명의 친구가 여행을 갔다. 여행 중에는 택시, 호텔 팁, 식당 식사처럼 여러 활동에 돈을 내야 하는 경우가 자주 생겼다. 여행이 끝난 뒤 친구들은 누가 누구에게 얼마를 빚졌는지 계산했고, 그 결과가 행렬 Ai,jA_{i,j}이다. Ai,jA_{i,j}는 친구 ii가 친구 jj에게 전체적으로 갚아야 할 바이탈라르 금액이다. 친구에게는 1번부터 번호가 붙어 있다. 모든 i,ji, j에 대해 Ai,j=−Aj,iA_{i,j} = -A_{j,i}임이 보장된다.

이제 정산할 시간이다. 친구들은 모든 빚을 갚아 각자 잔액을 0으로 만들려고 한다. 채무자가 채권자에게 직접 송금하는 것이 가장 간단하다. 그러나 은행은 송금할 때마다 수수료를 떼어 간다. 그래서 친구들은 더 똑똑하게 정산하기로 했다. 각자 중요하게 여기는 것은 받을 돈과 낼 돈의 합계가 맞는지뿐이다. 누가 누구에게 보내는지는 상관없고, 마지막에 모든 계좌의 잔액만 맞으면 된다.

필요한 송금 횟수의 최솟값은 얼마인가?

입력

첫 줄에 친구 수를 나타내는 자연수 NN (1≤N≤161 \le N \le 16)이 주어진다. 이어서 NN개의 줄에 각각 정수 Ai,jA_{i,j}가 NN개씩 주어진다 (−109≤Ai,j≤109-10^9 \le A_{i,j} \le 10^9).

출력

첫 번째(유일한) 줄에 모든 빚을 정산하는 데 필요한 송금 횟수의 최솟값을 정수로 출력한다.

예제2

  1. 예제 1

    입력
    5
    0 -1 -1 0 0
    1 0 -1 0 0
    1 1 0 0 0
    0 0 0 0 5
    0 0 0 -5 0
    
    예상 출력
    2
    
  2. 예제 2

    입력
    4
    0 2 -1 2
    -2 0 -3 3
    1 3 0 -4
    -2 -3 4 0
    
    예상 출력
    2