Récursive de transformation de l'algorithme
Donné une quantité de cible et une liste de pièces, mon code est censé trouver le moins de pièces de monnaie nécessaire pour atteindre le montant cible.
Exemples:
-
C(78, [1, 5, 10, 25, 50]) = 6
- nous pouvons faire de 78 à partir de 3x25 + 3x1, pour 6 pièces de monnaie sont nécessaires
-
C(48, [1, 7, 24, 42]) = 2
- 48 = 2x24, donc 2 pièces sont suffisamment
-
C(35, [1, 3, 16, 30, 50]) = 3
- nous pouvons faire 35 de 2x16 + 1x3, donc 3 pièces suffisent
J'ai fait le code avec des boucles, mais comment puis-je faire en récursif?
def C(i, coins, cdict = None):
if cdict == None:
cdict = {}
if i <= 0:
cdict[i] = 0
return cdict[i]
elif i in cdict:
return cdict[i]
elif i in coins:
cdict[i] = 1
return cdict[i]
else:
min = 0
for cj in coins:
result = C(i - cj, coins)
if result != 0:
if min == 0 or (result + 1) < min:
min = 1 + result
cdict[i] = min
return cdict[i]
- quand vous dites "paire de pièces de monnaie", entendez-vous à la "liste des pièces"?
- Déjà, elle est récursive. Vous appelez
C
de l'intérieur de lui-même. Suis-je manqué quelque chose? - "La moins quantité de pièces de monnaie qui sont nécessaires"? Pour ce que? C'est vraiment mal expliqué.
- Je pense que le plus petit nombre de pièces de la liste qui s'ajoutent à l'égal de ce nombre.
- C'est sans doute la moins quantité de pièces de monnaie nécessaire d'ajouter jusqu'à
i
. C'est un assez bon exemple de problème de programmation dynamique.
Vous devez vous connecter pour publier un commentaire.
C'est le changer de prise problème. Voici le standard de la solution récursive,
V
s'agit de la liste de pièces de monnaie etC
le montant cible de l'argent:Et c'est une version optimisée, à l'aide de la programmation dynamique:
Les deux implémentations retournera toujours la solution optimale, mais le second sera beaucoup plus rapide pour les grandes entrées. Notez que l'algorithme glouton suggéré dans d'autres réponses donne une solution optimale que pour certaines combinaisons de la monnaie par exemple, il travaille pour les Américains de pièces de monnaie.
min_coins()
est appelé. D'abord,i = len(V)-1
etaC = C
.min_coins()
est une fonction d'assistance interneEssayez d'utiliser un algorithme glouton (la plus grande des pièces de monnaie en premier). Retirez la pièce de monnaie à partir de la liste après s'applique à l'ensemble et appeler la fonction à nouveau de l'intérieur.
print(greedy((1, 6, 7, 10), 13))
donne: {6: 1, 7: 1}. Si cela ne vous donne pas la bonne réponse, cela signifie seulement que vous n'étiez pas en mesure de mettre en œuvre correctement. Gourmand signifie qu'il va chercher tous les moyens possibles pour résoudre le problème, puis le choix optimal.De sorte que le meilleur endroit pour chercher de la programmation dynamique de la mise en œuvre est: interactive python
Cependant, après quelques essais j'ai constaté que ce n'est pas la solution la plus rapide. La bonne chose à ce sujet est que un seul passage suffit de trouver des valeurs pour toutes les valeurs de changement jusqu'montant nécessaire.
Mon préféré est encore d'utiliser la récursivité avec la mise en cache: