이런 상황을 겪어 본 적이 있나요? 가지고 있는 동전과 지폐("지불 수단")이 한정되어 있으면 정확한 금액을 내기가 의외로 어렵습니다. 위 상황은 결국 이렇게 해결되었습니다. 손님이 200 + 1크라운을 내고 100 + 0.50을 돌려받은 뒤, 다시 0.20 + 0.20을 내고 마지막으로 0.10을 돌려받았습니다. 즉, 모두 합쳐 7개의 지불 수단이 오갔습니다. 때로는 이보다 더 복잡할 수도 있습니다.
1크라운은 100헬러이므로 모든 금액은 소수점 아래 최대 두 자리로 나타낼 수 있습니다. 손님과 상점 주인이 각각 무엇을 가지고 있는지 주어질 때, 정해진 금액을 정확히 치르기 위해 오가야 하는 지불 수단의 최소 개수를 구하는 프로그램을 작성하세요. 손님이 자신의 지불 수단 일부를 내면 상점 주인이 거스름돈으로 자신의 지불 수단 일부를 돌려줍니다. 내든 돌려주든, 주인이 바뀐 지불 수단은 모두 "오간" 것으로 셉니다.
입력에는 여러 개의 작업이 들어 있습니다.
각 작업은 지불할 금액을 나타내는 음이 아닌 수 하나가 적힌 줄로 시작합니다. 그다음에는 손님(돈을 내는 쪽)이 가진 지불 수단 목록이 옵니다. 목록의 각 줄에는 지불 수단의 액면가(음이 아닌 수), 공백 한 칸, 그 액면가의 지불 수단 개수(음이 아닌 정수), 그리고 소문자 x가 차례로 적혀 있습니다. 예를 들어 200 3x는 액면가 200짜리 지불 수단 3개를 뜻합니다. 목록은 -1만 적힌 줄로 끝납니다.
손님 목록 뒤에는 상점 주인(돈을 받는 쪽)의 목록이 똑같은 형식으로 이어지며, 이 목록도 -1로 끝납니다. 이어서 다음 작업이 시작됩니다. 마지막 작업 뒤에는 -1만 적힌 줄이 하나 더 있어 입력의 끝을 나타냅니다.
각 목록은 최대 100줄입니다. 어느 누구도 합계 10,000단위를 넘게 가지고 있지 않으며, 지불 수단 개수도 500개를 넘지 않습니다. 액면가는 실제 화폐 체계를 따르지 않아도 됩니다. 정수가 아닐 수 있는 모든 값은 정수이거나 소수점 아래 한두 자리를 가진 소수로 주어집니다.
각 작업마다 한 줄씩 출력합니다. 정해진 금액을 정확히 치르기 위해 오가야 하는 지불 수단의 최소 개수를 X라 할 때 X tenders must be exchanged.를 출력합니다. 금액을 도저히 치를 수 없다면 대신 The payment is impossible.를 출력합니다.