Há pessoas em uma mesa. O ª pessoa tem que pagar dólares.
Algumas pessoas não têm as contas certas para pagar exatamente , portanto, apresentam o seguinte algoritmo.
Primeiro, todo mundo coloca um pouco de seu dinheiro na mesa. Então, cada indivíduo recebe de volta o dinheiro pago em excesso.
As notas têm um conjunto fixo de denominações (não faz parte da entrada).
Um exemplo: suponha que haja duas pessoas, Alice e Bob. Alice deve US $ 5 e tem cinco notas de US $ 1. Bob deve US $ 2 e tem uma nota de US $ 5. Depois que Alice e Bob colocam todo o seu dinheiro na mesa, Bob recebe US $ 3 e todo mundo fica feliz.
Claro, há momentos em que não é preciso colocar todo o dinheiro na mesa. Por exemplo, se Alice tinha mil notas de US $ 1, não é necessário que ela as coloque sobre a mesa e depois retire a maioria delas.
Quero encontrar um algoritmo com as seguintes propriedades:
A entrada especifica o número de pessoas, quanto cada pessoa deve e quantas notas de cada denominação cada pessoa possui.
O algoritmo diz a cada pessoa quais contas colocar na mesa na primeira rodada.
O algoritmo informa a cada pessoa quais contas remover da tabela na segunda rodada.
O número de notas colocadas na mesa + o número de notas removidas da mesa é minimizado.
Se não houver solução viável, o algoritmo retornará um erro.
fonte
Respostas:
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:n n−1 pi i p0
Ou seja, quando a refeição termina, o restaurante deve ter US $ 61, Alice, US $ 11, Bob, US $ 1 e Carl, US $ 5.
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.
Continuando nosso exemplo:
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:
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:
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
que é quase o mesmo, exceto que Carl levou os "outros" US $ 5 que Bob colocou na mesa.
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.
fonte
Certamente, algumas etapas básicas podem incluir as menores faturas disponíveis para atingir o valor total da fatura geral. Se você não quiser permitir contas de US $ 2, cada pessoa pode simplesmente remover a maior conta que pode receber da piscina e chegar lá com relativa rapidez. A nota de US $ 2 joga isso fora, pois não se subdivide muito bem nas outras denominações e complica muito o problema. Certamente, também existem várias outras otimizações que podem ser feitas para fazer observações sobre a necessidade de adicionar mais fundos durante a primeira rodada (por exemplo, se o número total de notas de US $ 1 for suficiente para cobrir a conta, então todos pode parar de incluir, a menos que ainda não tenham investido o suficiente para pagar sua conta).
fonte