Il y a personnes à une table. La ème personne doit payer dollars.
Certaines personnes n'ont pas les bonnes factures pour payer exactement , alors elles proposent l'algorithme suivant.
Tout d'abord, tout le monde met une partie de son argent sur la table. Ensuite, chaque individu reprend l'argent qu'il a payé en trop.
Les factures ont un ensemble fixe de coupures (ne font pas partie de l'entrée).
Un exemple: supposons qu'il y ait deux personnes, Alice et Bob. Alice doit 5 $ et a cinq billets de 1 $ . Bob doit 2 $ et a un billet de 5 $ . Après qu'Alice et Bob aient mis tout leur argent sur la table, Bob reprend 3 $ et tout le monde est content.
Bien sûr, il y a des moments où l'on n'a pas à mettre tout son argent sur la table. Par exemple, si Alice avait mille billets de 1 $ , il n'est pas nécessaire qu'elle les mette tous sur la table puis les reprenne.
Je veux trouver un algorithme avec les propriétés suivantes:
L'entrée spécifie le nombre de personnes, combien chaque personne doit et combien de factures de chaque dénomination chaque personne a.
L'algorithme indique à chaque personne les factures à mettre sur la table au premier tour.
L'algorithme indique à chaque personne les factures à retirer du tableau au deuxième tour.
Le nombre de factures déposées sur la table + le nombre de factures retirées de la table est minimisé.
S'il n'y a pas de solution réalisable, l'algorithme renvoie simplement une erreur.
la source
Réponses:
Si vous reformulez le problème d'une manière légèrement différente (mais équivalente), un algorithme devient plus évident:
Autrement dit, lorsque le repas est terminé, le restaurant devrait avoir 61 $ , Alice devrait avoir 11 $ , Bob devrait avoir 1 $ et Carl devrait avoir 5 $ .
Les coupures des billets n'ont pas d'importance, mais j'ai choisi les coupures de papier américain pour cet exemple parce qu'elles sont familières.
Poursuivant notre exemple:
indique que Alice a commencé avec $ 1, $ 5, $ 10, $ 20, Bob a commencé avec $ 1, $ 1, $ 5, $ 5, et Carl a commencé avec $ 10 et $ 20.
Encore une fois, l'objectif est de minimiser le nombre de factures qui changent de mains. En d'autres termes:
La première contrainte dit que la solution ne peut affecter une facture particulière qu'à une seule partie, et la seconde garantit que chacun paie le montant approprié.
Il s'agit du problème de PROGRAMMATION 0,1 INTEGER et il est NP-complet (voir [ Karp 1972 ]). La page Wikipedia sur la programmation linéaire contient des informations sur différents algorithmes qui peuvent être utilisés pour ces types de problèmes.
Il existe potentiellement plusieurs solutions optimales; à la main, la première solution à l'exemple que j'ai proposé était:
ce qui signifie Alice paie exactement $ 5 et $ 20, Bob paie exactement $ 1, $ 5 et $ 5 et Carl surpaye $ 10 et $ 20 et retire ensuite un $ 5 à partir de la table.
J'ai également utilisé le module Mixed Integer Linear Program du système Sage Math qui a la capacité d'utiliser différents backends de solveurs ( GLPK , COIN , CPLEX ou Gurobi ). La première solution qu'il a donnée a été
ce qui est presque le même sauf que Carl a pris les "autres" 5 $ que Bob a mis sur la table.
Identifier un sous-ensemble de personnes qui peuvent payer le total réduit? Ou peut-être un sous-ensemble de personnes qui pourraient encore payer la totalité de la facture, c'est-à-dire payer pour leur ami.
Votre déclaration finale donne l'impression que vous êtes intéressé par le cas où les coupures des factures sont fixes, cela ne change cependant pas le problème.
la source
Il est certain que certains départs de base pourraient consister à inclure les plus petites factures disponibles pour atteindre le montant total de la facture globale. Si vous ne vous souciez pas d'autoriser des billets de 2 $ , chaque personne pourrait simplement retirer la plus grosse facture qu'elle puisse retirer de la piscine et arriverait assez rapidement. Le billet de 2 $ jette cela car il ne se sous-divise pas bien entre les autres dénominations et complique grandement le problème. Il y a aussi certainement un certain nombre d'autres optimisations qui pourraient être faites pour faire des observations sur la nécessité d'ajouter des fonds supplémentaires au cours de la ronde 1 (par exemple, si le nombre total de billets de 1 $ est jamais suffisant pour couvrir la facture, alors tout le monde peuvent arrêter de mettre en place à moins qu'ils n'aient pas encore mis assez pour leur facture).
la source