약간 다른 (그러나 동등한) 방식으로 문제를 다시 설명하면 알고리즘이 더 분명해집니다.
있습니다 당사자 참여 : N - 1 명, 한 restauarant입니다가. 하자 P 내가 돈 파티의 금액 내가 해야 후 식사가 끝나고 지불한다. 예를 들어 Alice가 36 달러 이고 25 달러를 빚지고 Bob은 12 달러 와 11 달러를 빚고 Carl은 30 달러 와 25 달러를 빚 으면 p 0 은 식당이고엔n - 1피나는나는피0
p = ( 61 , 11 , 1 , 5 )
즉, 식사가 끝나면 식당은 $ 61, Alice는 $ 11, Bob은 $ 1, Carl은 $ 5를 가져야합니다 .
이제하자 의 모든 열거 m의 관련 법안을. 예를 들면 다음과 같습니다.비엠
b = ( 1 , 5 , 10 , 20 , 1 , 1 , 5 , 5 ,10 , 20 )
이 법안의 명칭은 중요하지 않지만,이 예에서는 친숙한 종이 지폐를 선택했습니다.
우리는 사람과 "비용"을 연결할 수 있도록 변경 손이 법안의 수를 최소화하기 위해 찾고 있습니다 청구서와 함께 떠나는 J 사용하여 { 0 , 1 } 행렬 C를 . 이 행렬에서 0을 입력하면 각 당사자가 시작하는 청구서가 표시됩니다 ( 레스토랑이 청구서없이 시작하므로 모든 j에 대해 C 0 , j = 0 ).나는j{ 0 , 1 }기음기음0 , j= 0j
우리의 예를 계속하십시오 :
기음= ⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
Alice는 $ 1, $ 5, $ 10, $ 20로 시작했으며 Bob은 $ 1, $ 1, $ 5, $ 5로 시작했으며 Carl은 $ 10 및 $ 20로 시작했습니다 .
다시, 목표는 손을 바꾸는 법안의 수를 최소화하는 것입니다. 다른 말로:
최소화 :대상 :과∑나는 = 0n - 1∑j = 0m - 1기음I , J엑스I , J∑나는 = 0n - 1엑스I , J= 1 에 대한 0 ≤ J < m ,∑j = 0m - 1엑스I , J비j= p나는 대 0 ≤ I < N ,엑스I , J≥ 0
첫 번째 제약 조건은 솔루션이 한 당사자에게만 특정 청구서를 할당 할 수 있으며 두 번째 제약 조건은 모든 사람이 적절한 금액을 지불하도록합니다.
이것은 0,1 정수 프로그래밍 문제이며 NP- 완료입니다 ([ Karp 1972 ] 참조 ). 선형 프로그래밍 에 대한 Wikipedia 페이지 에는 이러한 유형의 문제에 사용할 수있는 다양한 알고리즘에 대한 정보가 있습니다.
잠재적으로 여러 최적 솔루션이 있습니다. 내가 생각해 낸 예제의 첫 번째 해결책은 다음과 같습니다.
x = ⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
이는 Alice가 정확히 $ 5와 $ 20를 지불하고 Bob이 정확히 $ 1, $ 5와 $ 5를 지불 하고 Carl이 $ 10와 $ 20을 초과 지불 한 다음 테이블에서 $ 5 를 제거한다는 의미 입니다.
나는 또한의 혼합 정수 선형 프로그램 모듈을 사용 세이지 수학 서로 다른 해석 백엔드 (사용할 수있는 기능이 시스템 GLPK , 동전 , CPLEX , 또는 Gurobi을 ). 첫 번째 해결책은
x = ⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
Carl이 밥이 테이블에 놓은 "다른"$ 5를 가져간 것을 제외하고는 거의 동일합니다.
기음엑스
감소 된 총액을 지불 할 수있는 사람들의 하위 집합을 식별합니까? 또는 전체 청구서를 계속 지불 할 수있는 사람들의 일부일 수도 있습니다. 즉, 친구를 위해 지불합니다.
최종 성명서는 청구서의 명칭이 수정 된 경우에 관심이있는 것처럼 보이지만 문제는 변경되지 않습니다.
O ( 1 )