Ce que vous cherchez, c'est Programmation dynamique .
En fait, il n'est pas nécessaire d'énumérer toutes les combinaisons possibles pour toutes les valeurs possibles, car vous pouvez les construire par-dessus les réponses précédentes.
Votre algorithme doit prendre 2 paramètres :
- La liste des valeurs possibles des pièces, ici
[1, 5, 10, 25]
- La gamme à couvrir, ici
[1, 99]
Et le but est de calculer l'ensemble minimal de pièces nécessaires pour cette gamme.
La méthode la plus simple consiste à procéder de manière ascendante :
Range Number of coins (in the minimal set)
1 5 10 25
[1,1] 1
[1,2] 2
[1,3] 3
[1,4] 4
[1,5] 5
[1,5]* 4 1 * two solutions here
[1,6] 4 1
[1,9] 4 1
[1,10] 5 1 * experience tells us it's not the most viable one :p
[1,10] 4 2 * not so viable either
[1,10] 4 1 1
[1,11] 4 1 1
[1,19] 4 1 1
[1,20] 5 1 1 * not viable (in the long run)
[1,20] 4 2 1 * not viable (in the long run)
[1,20] 4 1 2
C'est assez facile, à chaque étape nous pouvons procéder en ajoutant au plus une pièce, nous devons juste savoir où. Cela se résume au fait que l'intervalle [x,y]
est inclus dans [x,y+1]
donc l'ensemble minimal pour [x,y+1]
devrait inclure l'ensemble minimal pour [x,y]
.
Comme vous l'avez peut-être remarqué, il y a parfois des indécisions, c'est-à-dire que plusieurs séries ont le même nombre de pièces. Dans ce cas, ce n'est que plus tard que l'on peut décider laquelle doit être éliminée.
Il devrait être possible d'améliorer son temps de fonctionnement, en remarquant que l'ajout d'une pièce permet généralement de couvrir une plage bien plus grande que celle pour laquelle vous l'avez ajoutée, je pense.
Par exemple, notez que :
[1,5] 4*1 1*5
[1,9] 4*1 1*5
nous ajoutons une pièce de 5 cents pour couvrir [1,5]
mais cela nous donne jusqu'à [1,9]
gratuitement !
Cependant, lorsqu'il s'agit d'ensembles d'entrées scandaleuses [2,3,5,10,25]
pour couvrir [2,99]
Je ne sais pas comment vérifier rapidement l'étendue de la couverture du nouvel ensemble ou si cela serait plus efficace.
3 votes
Je pensais que la réponse était évidente jusqu'à ce que je commence à y réfléchir... bon Q !
2 votes
Ne le prenez pas mal, mais ce n'est pas un problème difficile. L'algorithme que vous proposez devrait être O(1), et il est choquant pour moi qu'il y ait des choses ci-dessous qui ne le sont pas...
3 votes
@Thanatos : C'est parce que vous avez mal interprété la question. Vous devez être capable de faire chaque valeur de 1-99, et pas seulement 99 lui-même.
0 votes
@Tim : Les pièces de 50 cents sont trop rares :).
1 votes
Pour mémoire, ce problème ne nécessite pas d'algorithme :) Si vous regardez ce dont vous avez besoin pour gagner 99 cents, dans le sens de l'avidité, vous verrez qu'à partir de ce changement, vous pouvez faire tout le reste.
0 votes
Je dirais deux séries différentes de dix pièces. A moins que tu ne veuilles dire chaque de 1 à 99 cents, auquel cas il vous faut 200 pennies, 40 nickels, 80 dimes et 150 quarters pour un total de 470 pièces d'une valeur de 49,50 $.
0 votes
Cela ne devrait-il pas être un Code Golf question ?