Рассмотрим проблему, в которой у вас есть значение N
, и вам нужно рассчитать, сколько способов вы можете суммировать до N
долларов, используя [1,2,5,10,20,50,100]
долларовых купюр.
Рассмотрите классический DPрешение:
C = [1,2,5,10,20,50,100]
def comb(p):
if p==0:
return 1
c = 0
for x in C:
if x <= p:
c += comb(p-x)
return c
Не влияет порядок суммированных частей.Например, comb(4)
даст 5 результатов: [1,1,1,1],[2,1,1],[1,2,1],[1,1,2],[2,2]
, тогда как на самом деле есть 3 результата ([2,1,1],[1,2,1],[1,1,2]
все одинаковые).
Какова идиома DP для вычисления этой проблемы?( не элегантные решения, такие как создание всех возможных решений и удаление дубликатов, не приветствуются)