Coin Change
Masz nieograniczony zapas monet o kilku różnych nominałach i chcesz zapłacić dokładną kwotę, używając jak najmniejszej liczby monet.
Wydaje się, że najlepiej wziąć największą monetę, która jeszcze pasuje, ale to może się nie udać. Przy monetach [1, 3, 4] i kwocie 6 wzięcie najpierw największej monety daje 4 + 1 + 1, czyli trzy monety, podczas gdy 3 + 3 wymaga tylko dwóch.
Bezpieczniejszym sposobem jest budowanie rozwiązania od małych kwot. Niech fewest[t] oznacza najmniejszą liczbę monet, których suma wynosi t. Zapłacenie 0 nie wymaga żadnych monet. Dla każdego innego t ostatnia użyta moneta ma jakąś wartość c, a pozostała wcześniej kwota to t - c, więc
fewest[t] = 1 + the smallest fewest[t - c] spośród wszystkich monet c, których wartość nie przekracza t.
Dla [1, 3, 4]: fewest[3] = 1, a fewest[6] = 1 + fewest[3] = 2. Jeśli żadna moneta nie prowadzi do osiągalnej kwoty, nie da się zapłacić t.
Napisz funkcję o nazwie coinChange, która przyjmuje coins, listę różnych wartości monet, oraz liczbę całkowitą amount i zwraca najmniejszą liczbę monet, których suma wynosi dokładnie amount. Każdej wartości monety możesz użyć dowolną liczbę razy. Zwróć -1, jeśli nie da się uzyskać podanej kwoty, a 0, gdy amount wynosi 0.
Na przykład coins = [2, 5, 10] i amount = 27 zwraca 4 (10 + 10 + 5 + 2), a coins = [4, 6] przy amount = 7 zwraca -1.
Ograniczenia: 1 <= coins.length <= 12, 1 <= coins[i] <= 10^4, wszystkie wartości są różne, 0 <= amount <= 10^4.
Funkcja
- arg1integer-array
- arg2integer
- Zwracainteger
Przykłady
- Wejście
- arg1 = [2, 5, 10]arg2 = 27
- Wyjście
- 4
- Wejście
- arg1 = [4, 6]arg2 = 7
- Wyjście
- -1
- Wejście
- arg1 = [3, 7]arg2 = 0
- Wyjście
- 0
+12 ukrytych testów przy wysłaniu
Podpowiedzi
Otwieraj je po kolei. Każda zdradza trochę więcej.
Wybieranie za każdym razem największej pasującej monety nie zawsze daje najmniejszą liczbę monet. Sprawdź to dla monet
[1, 3, 4]i kwoty6.Załóżmy, że znasz już najmniejszą liczbę monet potrzebną dla każdej kwoty mniejszej niż
t. Z jakich mniejszych kwot można uzyskaćt, dodając jedną monetę?Wypełnij tablicę
fewest[0..amount], zaczynając od0:fewest[0] = 0, a każda wartośćfewest[t]jest o jeden większa od najlepszej wartościfewest[t - c]spośród monetc <= t. Kwoty, których nie da się uzyskać, oznacz wartością większą niż każda rzeczywista odpowiedź, na przykładamount + 1, a na końcu zamień ją na-1.
Pełne omówienie tego zadania pojawi się wkrótce.
Podobne zadania
Zadania oparte na tych samych pomysłach. Rozwiązanie dwóch lub trzech utrwala schemat.
Python
def coinChange(coins, amount):
# Wpisz kod tutajPrzypadek 1
Przypadek 2
Przypadek 3
Wejście
arg1 = [2, 5, 10] arg2 = 27
Oczekiwane
4