J'essaye actuellement d'implémenter la programmation dynamique en Python, mais je ne sais pas comment installer la partie de backtracking de sorte qu'elle ne répète pas les permutations. Par exemple, une entrée serait (6, [1,5]) et la sortie attendue devrait être 2 car il y a 2 façons possibles d'agencer 1 et 5 pour que leur somme soit équivalente à 6. Ces combinaisons sont {1, 1,1,1,1,1} et {1,5} mais comme mon programme fonctionne actuellement, il tient compte des combinaisons affichées ci-dessus et de la combinaison {5,1}. Cela provoque la sortie à 3 ce qui n'est pas ce que je voulais. Donc ma question est "Comment puis-je empêcher de répéter des permutations?". Mon code actuel est indiqué ci-dessous.Programmation dynamique de pièce de monnaie de Python
import collections as c
class DynamicProgram(object):
def __init__(self):
self.fib_memo = {}
# nested dictionary, collections.defaultdict works better than a regular nested dictionary
self.coin_change_memo = c.defaultdict(dict)
self.__dict__.update({x:k for x, k in locals().items() if x != 'self'})
def coin_change(self, n, coin_array):
# check cache
if n in self.coin_change_memo:
if len(coin_array) in self.coin_change_memo[n]:
return [n][len(coin_array)]
# base cases
if n < 0: return 0
elif n == 1 or n == 0: return 1
result = 0
i = 0
# backtracking (the backbone of how this function works)
while i <= n and i < len(coin_array):
result += self.coin_change(n-coin_array[i], coin_array)
i += 1
# append to cache
self.coin_change_memo[n][len(coin_array)] = result
# return result
return result
Possible duplicata de [Mémoizing Coin Change] (https://stackoverflow.com/questions/20742714/memoizing-coin-change) –