Il s'agit d'un problème de récurrence. Étant donné un ensemble de pièces de monnaie {Cn, Cn-1, . . ., 1}
de telle sorte que pour 1 <= k <= n, Ck > Ck-1
l'algorithme de la cupidité donnera le nombre minimal de pièces si Ck > Ck-1 + Ck-2 et pour la valeur V=(Ck + Ck-1) - 1
en appliquant l'algorithme de la cupidité au sous-ensemble de pièces {Ck, Ck-1, . . ., 1}
donde Ck <= V
donne moins de pièces que le nombre résultant de l'application de l'algorithme de la cupidité au sous-ensemble de pièces. {Ck-1, Ck-2, . . ., 1}
.
Le test est simple : pour `1 <= k <= n, testez le nombre de pièces que l'algorithme Greedy donne pour une valeur de Ck + Ck-1 - 1. Faites-le pour les ensembles de pièces {Ck, Ck-1, . . ., 1} et {Ck-1, Ck-2, . . ., 1}. Si pour n'importe quel k, le second donne moins de pièces que le premier, l'algorithme de la cupidité ne fonctionnera pas pour ce jeu de pièces.
Par exemple, avec n=4, on considère l'ensemble de pièces {C4, C3, C2, 1} = {50,25,10,1}. Commençons par k=n=4, puis V = Cn + Cn-1 - 1 = 50+25-1 = 74 comme valeur test. Pour V=74, G{50,25,10,1} = 7 pièces. G{25, 10, 1} = 8 pièces. Jusqu'ici, tout va bien. Maintenant, laissons k=3. Alors V=25+10-1=34. G{25, 10, 1} = 10 pièces mais G{10, 1} = 7 pièces. Nous savons donc que l'algorithme de la cupidité ne minimisera pas le nombre de pièces pour l'ensemble de pièces {50,25,10,1}. Par contre, si nous ajoutons une pièce de 5 cents à cet ensemble de pièces, G{25, 10, 5, 1} = 6 et G{10, 5, 1} = 7. De même, pour V=10+5-1=14, nous obtenons G{10, 5, 1} = 5, mais G{5,1} = 6. Nous savons donc que le Greedy fonctionne pour {50,25,10,5,1}.
D'où la question suivante : quelle devrait être la dénomination des pièces, satisfaisant l'algorithme de la cupidité, qui aboutit au plus petit nombre de pièces dans le pire des cas pour toute valeur de 1 à 100 ? La réponse est assez simple : 100 pièces, chacune ayant une valeur différente de 1 à 100. On peut dire que ce n'est pas très utile, car il s'agit d'une recherche linéaire de pièces à chaque transaction. Sans parler du coût de la frappe de tant de dénominations différentes et de leur suivi.
Maintenant, si nous voulons d'abord minimiser le nombre de dénominations tout en minimisant ensuite le nombre de pièces résultant pour toute valeur de 1 à 100 produite par Greedy, alors les pièces en dénominations de puissances de 2 : {64, 32, 16, 8, 4, 2, 1} donnent un maximum de 6 pièces pour toute valeur 1:100 (le nombre maximum de 1 dans un nombre de sept bits dont la valeur est inférieure à 100 en décimal). Mais cela nécessite 7 dénominations de pièces. Le pire cas pour les cinq dénominations {50, 25, 10, 5, 1} est 8, ce qui se produit à V=94 et V=99. Les pièces en puissances de 3 {1, 3, 9, 27, 81} ne nécessitent également que 5 dénominations pour être utilisables par Greedy mais donnent également un pire cas de 8 pièces aux valeurs de 62 et 80. Enfin, l'utilisation de n'importe quel sous-ensemble de cinq dénominations de {64, 32, 16, 8, 4, 2, 1} qui ne peut exclure '1' et qui satisfait Greedy, donnera également un maximum de 8 pièces. Il y a donc un compromis linéaire. L'augmentation du nombre de dénominations de 5 à 7 réduit le nombre maximal de pièces nécessaires pour représenter toute valeur comprise entre 1 et 100 de 8 à 6, respectivement.
D'un autre côté, si vous voulez minimiser le nombre de pièces de monnaie échangé entre un acheteur et un vendeur, en supposant que chacun a au moins une pièce de chaque dénomination dans sa poche, alors ce problème est équivalent au plus petit nombre de poids qu'il faut pour équilibrer tout poids de 1 à N livres. Il s'avère que le plus petit nombre de pièces échangées lors d'un achat est atteint si les dénominations des pièces sont données en puissances de 3 : {1, 3, 9, 27, . . .}
.
Voir https://puzzling.stackexchange.com/questions/186/whats-the-fewest-weights-you-need-to-balance-any-weight-from-1-to-40-pounds .
3 votes
La réponse dépend beaucoup de ce que fait l'algorithme : il est facile d'être gourmand en pièces de monnaie, vous devriez nous dire ce que fait l'algorithme, et comment il le fait.
2 votes
... quel est le problème réel que l'algorithme est censé résoudre ?
2 votes
Ok, je suppose que je n'ai pas bien posé la question. Qu'en est-il d'un ensemble de dénominations qui doivent être vraies pour que l'algorithme ne fonctionne pas. Ex. faire 30 cents à partir de (25, 15, 1) greedy nous donne 25,1,1,1,1,1 mais 15 15 est mieux. Qu'est-ce qui fait que 25 15 et 1 empêchent l'algorithme de fonctionner ?
0 votes
Examinez s'ils forment une fr.wikipedia.org/wiki/Matroïde .
2 votes
C'est une bonne question, je ne sais pas pourquoi elle a été déclassée. Cette personne souhaite obtenir une explication sur les contraintes qu'un ensemble de pièces doit satisfaire pour que l'algorithme gourmand (qui sélectionne toujours la plus grande pièce possible) choisisse un nombre minimum de pièces pour payer un montant donné.
2 votes
@j_random_hacker On peut le déduire du commentaire de l'OP, mais pas de la question. La question elle-même ne contient aucun indice sur ce que l'algorithme est censé faire, et ce n'est donc pas une bonne question.
0 votes
@DanielFischer : C'est juste. C'est bien d'avoir corrigé la question.
1 votes
Je me posais la même question : pourquoi l'algorithme de changement de pièces fonctionne-t-il pour certains jeux de pièces ? Il existe un article qui donne une expression très laide sur la condition suffisante pour que la solution gourmande soit optimale. Croyez-moi, vous ne voulez pas lire cela :-)
1 votes
Je vote pour que cette question soit classée hors sujet car elle a sa place sur math.stackexchange.com.