빚의 고리

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

요약
세 사람의 채무와 각자 보유한 지폐와 동전이 주어질 때, 모든 빚을 정산하기 위해 주고받아야 하는 최소 개수의 지폐와 동전을 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 백트래킹, 완전 탐색, 구현
정답자
아직 제출이 없습니다

문제

세 친구 앨리스, 밥, 신시아는 늘 서로 갚아야 할 빚이 생기곤 한다. 자주 어울려 다니다 보면 어쩔 수 없는 일이다. 식당에 몇 번 가고, 영화를 보고, 술을 몇 잔 나누다 보면 금세 정산하지 못한 잔액이 쌓인다. 그래서 이들은 매주 금요일 오후에 만나면 지난주에 진 빚부터 정리하며 저녁을 시작한다.

수학을 좋아하는 이들은 빚을 갚을 때 되도록 적은 돈만 오가도록, 즉 주고받는 지폐와 동전의 개수를 최소로 하여 정산하고 싶어 한다. 그런데 이것이 생각보다 까다로울 때가 있다.

예를 들어 앨리스가 밥에게 10크라운을 빚졌고 이것이 세 친구의 유일한 미정산 채무라고 하자. 앨리스는 50크라운짜리 지폐 한 장만 가지고 있고 그보다 작은 돈은 없으며, 밥은 10크라운 동전 세 개와 1크라운 동전 열 개를 가지고 있고, 신시아는 20크라운짜리 지폐 세 장을 가지고 있다. 이때 빚을 가장 적게 움직여 갚는 방법은, 앨리스가 50크라운 지폐를 신시아에게 주고, 신시아가 20크라운 지폐 두 장을 앨리스에게, 한 장을 밥에게 주고, 밥이 10크라운 동전 하나를 신시아에게 주는 것이다. 이렇게 하면 주인이 바뀌는 지폐와 동전은 모두 다섯 개뿐이다. 반면 앨리스가 50크라운 지폐를 밥에게 그냥 건네고 거스름돈으로 10크라운 동전 세 개와 1크라운 동전 열 개를 받는 단순한 방법은 무려 열네 개나 주고받아야 한다.

세 친구 사이의 빚과 각자가 지금 가지고 있는 돈이 주어질 때, 모든 빚을 정산하기 위해 주인이 바뀌어야 하는 지폐와 동전의 최소 개수를 구하라.

입력

첫째 줄에 테스트 케이스의 개수를 나타내는 양의 정수 tt (1≤t≤501 \le t \le 50)가 주어진다.

각 테스트 케이스의 첫 줄에는 세 정수 abab, bcbc, caca (각각 10001000 이하)가 주어진다. abab는 앨리스가 밥에게 진 빚이며, 값이 음수이면 반대로 밥이 앨리스에게 빚진 것이다. bcbc는 밥이 신시아에게 진 빚이며, 음수이면 신시아가 밥에게 빚진 것이다. caca는 신시아가 앨리스에게 진 빚이며, 음수이면 앨리스가 신시아에게 빚진 것이다.

이어지는 세 줄에는 앨리스, 밥, 신시아가 각각 가진 돈이 이 순서대로 주어진다. 각 줄에는 여섯 개의 음이 아닌 정수가 있으며, 그 사람이 가진 100, 50, 20, 10, 5, 1크라운 지폐·동전의 개수를 이 순서대로 나타낸다. 각 사람이 가진 동전은 최대 30개이다(즉, 각 사람에 대해 10, 5, 1크라운짜리 개수의 합이 3030 이하이다). 또한 세 사람이 가진 돈의 총액은 항상 10001000크라운 미만이다.

출력

각 테스트 케이스마다 한 줄에, 잔액을 정산하기 위해 주인이 바뀌어야 하는 지폐와 동전의 최소 개수를 출력한다. 정산이 아예 불가능하다면 대신 문자열 impossible을 출력한다.

예제3

  1. 예제 1

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

    입력
    1
    0 0 0
    1 0 0 0 0 0
    0 0 0 0 0 5
    0 0 1 0 0 0
    
    예상 출력
    0
    
  3. 예제 3

    입력
    1
    20 20 20
    0 1 0 0 0 0
    0 0 2 0 0 0
    1 0 0 0 0 0
    
    예상 출력
    0