Ideą kodu jest następujący: " Na każdym kroku dostępne są ways
sposoby na zmianę i
kwoty pieniędzy podanych monet [1,...coin]
".
Tak więc w pierwszej iteracji masz tylko monetę o nominale 1
. Uważam, że oczywiste jest, że istnieje tylko jeden sposób, aby zmienić tylko monety na dowolny cel. Na tym etapie tablica będzie wyglądać następująco: [1,...1]
(tylko jeden sposób dla wszystkich obiektów docelowych od 0
do target
).
W następnym kroku dodajemy monetę o nominale 2
do poprzedniego zestawu monet. Teraz możemy obliczyć, ile kombinacji zmian istnieje dla każdego celu od 0
do target
. Oczywiście liczba kombinacji zwiększy się tylko dla celów> = 2
(lub w ogóle w przypadku dodania nowej monety). Tak więc, jeśli cel wynosi 2
, liczba kombinacji będzie wynosić ways[2](old)
+ ways[0](new)
. Generalnie, za każdym razem, gdy i
równa się nowej wprowadzonej monecie, musimy dodać 1
do poprzedniej liczby kombinacji, gdzie nowa kombinacja będzie składać się tylko z jednej monety.
Dla target
>2
, odpowiedź będzie składać się z sumy „wszystkie kombinacje target
ilości posiadające wszystkie monety mniej niż coin
” i „wszystkie kombinacje coin
ilości posiadające wszystkie monety mniej niż sama coin
”.
Tutaj opisałem dwa podstawowe kroki, ale mam nadzieję, że łatwo je uogólnić.
Pokażę ci obliczeniowej drzewo dla target = 4
i coins=[1,2]
:
sposoby [4] Podane monety = [1,2] =
sposoby [4] Podane monety = [1] + sposób [2] podane monety = [1,2] =
1 + sposób [2] podane monety = [1] + sposoby [0] podane monety = [1,2] =
1 + 1 + 1 = 3
Istnieją trzy sposoby zmiany: [1,1,1,1], [1,1,2], [2,2]
.
Powyższy kod jest całkowicie równoważny rozwiązaniu rekursywnemu. Jeśli rozumiesz the recursive solution, założę się, że rozumiesz rozwiązanie podane powyżej.