Se você reafirmar o problema de uma maneira um pouco diferente (mas equivalente), um algoritmo se tornará mais óbvio:
Não há partes envolvidas: n - 1 pessoas e um restaurante. Deixe p i ser a quantidade de partido dinheiro i deve ter após a refeição é concluído e pago. Por exemplo, se Alice tem $ 36 e deve $ 25, Bob tem $ 12 e deve $ 11, e Carl tem $ 30 e deve $ 25, dizemos que p 0 é o restaurante e temos:nn−1piip0
p=(61,11,1,5)
Ou seja, quando a refeição termina, o restaurante deve ter US $ 61, Alice, US $ 11, Bob, US $ 1 e Carl, US $ 5.
bm
b=(1,5,10,20,1,1,5,5,10,20)
As denominações das notas não importam, mas eu escolhi denominações da moeda americana em papel para este exemplo, porque elas são familiares.
ij{0,1}CC0,j=0j
Continuando nosso exemplo:
C=⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
indica que Alice começou com $ 1, $ 5, $ 10, $ 20, Bob começou com $ 1, $ 1, $ 5, $ 5 e Carl começou com $ 10 e $ 20.
Novamente, o objetivo é minimizar o número de notas que mudam de mãos. Em outras palavras:
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
A primeira restrição diz que a solução pode atribuir apenas uma fatura específica a uma parte e a segunda garante que todos paguem o valor apropriado.
Esse é o problema de 0,1 INTEGER PROGRAMMING e está completo em NP (consulte [ Karp 1972 ]). A página da Wikipedia sobre programação linear possui informações sobre diferentes algoritmos que podem ser usados para esses tipos de problemas.
Existem potencialmente várias soluções ideais; manualmente, a primeira solução para o exemplo que surgiu foi:
x = ⎡⎣⎢⎢⎢0 010 00 010 00 00 00 010 00 010 00 00 010 010 00 00 00 00 00 00 00 0110 00 00 010 00 00 010 00 00 0⎤⎦⎥⎥⎥
o que significa que Alice paga exatamente US $ 5 e US $ 20, Bob paga exatamente US $ 1, US $ 5 e US $ 5, e Carl paga US $ 10 e US $ 20 e depois remove US $ 5 da mesa.
Também usei o módulo Programa Linear Inteiro Misto do sistema Sage Math , que tem a capacidade de usar diferentes back- end do solucionador ( GLPK , COIN , CPLEX ou Gurobi ). A primeira solução que deu foi
x = ⎡⎣⎢⎢⎢0 010 00 010 00 00 00 010 00 010 00 00 00 00 010 010 00 00 00 00 00 00 010 00 0110 00 00 010 00 00 0⎤⎦⎥⎥⎥
que é quase o mesmo, exceto que Carl levou os "outros" US $ 5 que Bob colocou na mesa.
Cx
Identifica um subconjunto de pessoas que podem pagar o total reduzido? Ou talvez um subconjunto de pessoas que ainda possam pagar a conta inteira, ou seja, paguem pelo amigo.
Seu extrato final faz parecer que você está interessado no caso de as denominações das notas serem fixas, mas isso não muda o problema.
O ( 1 )