Si reformula el problema de una manera ligeramente diferente (pero equivalente), un algoritmo se vuelve más obvio:
nn−1piyop0
p=(61,11,1,5)
Es decir, cuando la comida termina, el restaurante debería tener $ 61, Alice debería tener $ 11, Bob debería tener $ 1 y Carl debería tener $ 5.
bm
b=(1,5,10,20,1,1,5,5,10,20)
Las denominaciones de los billetes no importan, pero he elegido denominaciones de papel moneda estadounidense para este ejemplo porque son familiares.
ij{0,1}CC0,j=0j
Continuando con nuestro ejemplo:
C=⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
indica que Alice comenzó con $ 1, $ 5, $ 10, $ 20, Bob comenzó con $ 1, $ 1, $ 5, $ 5, y Carl comenzó con $ 10 y $ 20.
Nuevamente, el objetivo es minimizar la cantidad de billetes que cambian de manos. En otras palabras:
Minimize:subject to:and∑i=0n−1∑j=0m−1Ci,jxi,j∑i=0n−1xi,j=1 for 0≤j<m,∑j=0m−1xi,jbj=pi for 0≤i<n,xi,j≥0
La primera restricción dice que la solución solo puede asignar una factura particular a una de las partes, y la segunda asegura que todos paguen la cantidad apropiada.
Este es el problema de PROGRAMACIÓN INTEGRAL 0,1 y está completo para NP (ver [ Karp 1972 ]). La página de Wikipedia sobre programación lineal tiene información sobre diferentes algoritmos que pueden usarse para este tipo de problemas.
Hay potencialmente múltiples soluciones óptimas; A mano, la primera solución al ejemplo que se me ocurrió fue:
x=⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
lo que significa que Alice paga exactamente $ 5 y $ 20, Bob paga exactamente $ 1, $ 5 y $ 5, y Carl paga en exceso $ 10 y $ 20 y luego retira $ 5 de la mesa.
También utilicé el módulo de Programa lineal de enteros mixtos del sistema Sage Math que tiene la capacidad de usar diferentes backends de resolución ( GLPK , COIN , CPLEX o Gurobi ). La primera solución que dio fue
x=⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
which is almost the same except that Carl took the "other" $5 that Bob put on the table.
Formulating the problem in this way satisfies all the properties you list (you can extrapolate which bills end up where from C and the solution matrix x). The exception is perhaps #4 which was discussed in the comments of the question. It is not clear to me what you would like to do in the situation that there is no feasible solution to the set of linear equations:
Identify a subset of people that can pay the reduced total? Or perhaps a subset of people which could still pay the entire bill, i.e. they pay for their friend.
Your final statement makes it seem like you are interested in the case that the denominations of the bills are fixed, this doesn't change the problem however.
In any case, there is also an O(1) solution in which every person pays with a credit card.