청구서 문제를 일괄 지불


23

테이블 에는 명이 있습니다 . 번째 사람은 공중에있다 달러.nipi

어떤 사람들은 정확하게 지불하기에 적합한 청구서를 가지고 있지 않으므로 다음 알고리즘을 생각해냅니다.p나는

먼저, 모든 사람들이 돈을 약간 테이블에 넣습니다. 그런 다음 각 개인은 초과 지불 한 돈을 회수합니다.

청구서에는 고정 된 명칭 세트가 있습니다 (입력의 일부가 아님).

예 : Alice와 Bob이라는 두 사람이 있다고 가정합니다. 앨리스는 빚이 $ 5 다섯이 $ (1) 청구서를. 밥은 2 달러의 빚을지고 1 달러의 5 달러 법안을 가지고 있습니다. Alice와 Bob이 모든 돈을 테이블에 올려 놓은 후 Bob은 $ 3를 되찾아 모두가 행복합니다.

물론, 모든 돈을 테이블에 싣지 않아도되는 경우가 있습니다 . 예를 들어, Alice가 1 천 달러짜리 지폐를 가지고 있었다면 , 그녀가 테이블에 모두 넣은 다음 대부분을 다시 가져갈 필요는 없습니다.

다음 속성을 가진 알고리즘을 찾고 싶습니다.

  1. 입력은 사람 수, 각 사람이 빚진 금액 및 각 사람이 가진 각 교단의 청구서 수를 지정합니다.

  2. 알고리즘은 각 사람에게 첫 번째 라운드에서 테이블에 넣을 청구서를 알려줍니다.

  3. 이 알고리즘은 두 번째 라운드에서 테이블에서 제거 할 청구서를 각 사용자에게 알려줍니다.

  4. 테이블에 부과 된 청구서 수 + 테이블에서 제거 된 청구서 수가 최소화됩니다.

가능한 해결책이 없으면 알고리즘은 오류를 반환합니다.


9
청구서의 교단이 사전에 고정되어 있거나 (예 : 미국 교단 $ 1, $ 2, $ 5, $ 10, $ 20, $ 50 및 $ 100) 입력의 일부입니까? 즉, 알고리즘은 메피스토가 가지고있는 가능성을 처리 할 수 있는가 $ (7) 청구서하는 $ (13) 법안, 그리고 다섯 $ 4 청구서를 ?
JeffE

1
청구서가 수정되었습니다. 이 경우 하위 집합 합계를 줄이고 NP-Hard임을 증명할 수 없습니다. 편집하겠습니다.
Chao Xu

1
4/5를 단일 최적화로 표현할 수있는 방법이 필요합니다. 이 두 가지 독립 조건에 대해 최적화 할 수 없습니다. 나는 당신이 의도 한 것에 대해 알고 있으며, 전에 비슷한 문제가 있었지만 두 조건에 대해 최적화하는 것이 무엇을 의미하는지 정확하게 정량화해야합니다.
edA-qa mort-ora-y

3
나는 모든 사람들 이 청구서를 정확하게 지불하거나 알고리즘이 단순히 실패를보고 한다고 가정하는 것이 더 좋을 것이라고 생각합니다 .
JeffE

2
복잡성 요구 사항이 있습니까? 순진한 알고리즘을 작성하는 것이 사소한 것 같거나 뭔가 빠졌습니까?
Stéphane Gimenez

답변:


6

약간 다른 (그러나 동등한) 방식으로 문제를 다시 설명하면 알고리즘이 더 분명해집니다.

있습니다 당사자 참여 : N - 1 명, 한 restauarant입니다가. 하자 P 내가 돈 파티의 금액 내가 해야 식사가 끝나고 지불한다. 예를 들어 Alice가 36 달러 이고 25 달러를 빚지고 Bob은 12 달러 와 11 달러를 빚고 Carl은 30 달러 와 25 달러를 빚 으면 p 0 은 식당이고1나는나는0

=(61,11,1,5)

즉, 식사가 끝나면 식당은 $ 61, Alice는 $ 11, Bob은 $ 1, Carl은 $ 5를 가져야합니다 .

이제하자 의 모든 열거 m의 관련 법안을. 예를 들면 다음과 같습니다.

=(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

우리의 예를 계속하십시오 :

기음=[0000000000000011111111110000111111111100]

Alice는 $ 1, $ 5, $ 10, $ 20로 시작했으며 Bob은 $ 1, $ 1, $ 5, $ 5로 시작했으며 Carl은 $ 10 및 $ 20로 시작했습니다 .

다시, 목표는 손을 바꾸는 법안의 수를 최소화하는 것입니다. 다른 말로:

최소화 :나는=01j=01기음나는,j엑스나는,j대상 :나는=01엑스나는,j=1 ...에 대한 0j<,j=01엑스나는,jj=나는 ...에 대한 0나는<,엑스나는,j0

첫 번째 제약 조건은 솔루션이 한 당사자에게만 특정 청구서를 할당 할 수 있으며 두 번째 제약 조건은 모든 사람이 적절한 금액을 지불하도록합니다.

이것은 0,1 정수 프로그래밍 문제이며 NP- 완료입니다 ([ Karp 1972 ] 참조 ). 선형 프로그래밍 에 대한 Wikipedia 페이지 에는 이러한 유형의 문제에 사용할 수있는 다양한 알고리즘에 대한 정보가 있습니다.

잠재적으로 여러 최적 솔루션이 있습니다. 내가 생각해 낸 예제의 첫 번째 해결책은 다음과 같습니다.

엑스=[0101100111101000000000001000000000001000]

이는 Alice가 정확히 $ 5와 $ 20를 지불하고 Bob이 정확히 $ 1, $ 5와 $ 5를 지불 하고 Carl이 $ 10와 $ 20을 초과 지불 한 다음 테이블에서 $ 5 를 제거한다는 의미 입니다.

나는 또한의 혼합 정수 선형 프로그램 모듈을 사용 세이지 수학 서로 다른 해석 백엔드 (사용할 수있는 기능이 시스템 GLPK , 동전 , CPLEX , 또는 Gurobi을 ). 첫 번째 해결책은

엑스=[0101010111101000000000001000000000000100]

Carl이 밥이 테이블에 놓은 "다른"$ 5를 가져간 것을 제외하고는 거의 동일합니다.

기음엑스

감소 된 총액을 지불 할 수있는 사람들의 하위 집합을 식별합니까? 또는 전체 청구서를 계속 지불 할 수있는 사람들의 일부일 수도 있습니다. 즉, 친구를 위해 지불합니다.

최종 성명서는 청구서의 명칭이 수정 된 경우에 관심이있는 것처럼 보이지만 문제는 변경되지 않습니다.

영형(1)


이 문제는 IP가 (거의?) 분명하다고 표현 될 수있다. 그러나이 솔루션은 얼마나 좋습니까? 작성된 양식의 IP를 효율적으로 해결할 수 있습니까? 그렇지 않다면 더 빠른 알고리즘이 있습니까?
Raphael

0,1 변수보다 특정 명칭의 청구서 수에 대한 변수를 가짐으로써이 IP의 요약 된 형태가 존재합니다. 고정 명칭은 사람들의 수가 고정되어 있다면 Lenstra의 알고리즘은 다항식 시간으로 해결할 수 있습니다.
Chao Xu

-2

확실히 몇 가지 기본적인 시작은 전체 청구서의 총액에 도달 할 수있는 가장 작은 청구서를 포함시키는 것일 수 있습니다. 2 달러짜리 지폐 를 허용하지 않으려는 경우 각 사람은 수영장에서 가져갈 수있는 가장 큰 지폐를 간단히 제거 할 수 있으며 상대적으로 빠르게 도착할 수 있습니다. $ 2 법안은 슬로우는 다른 교단에 있지 서브 분할 잘 수행하고 크게 문제가 복잡로 떨어져. 또한 1 라운드 동안 추가 자금이 추가 될 필요성을 관찰하기 위해 수행 될 수있는 다른 여러 가지 최적화 방법도 있습니다 (예 : 총 $ 1 청구서 수가 청구서를 충당하기에 충분한 경우 아직 청구서에 충분한 금액을 넣지 않은 경우 투입을 중단 할 수 있습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.