Coin Change
Hai una quantità illimitata di monete di alcuni valori diversi e vuoi pagare un importo esatto usando il minor numero possibile di monete.
Prendere la moneta più grande che ci sta sembra la scelta giusta, ma può non funzionare. Con le monete [1, 3, 4] e un importo di 6, scegliendo prima la moneta più grande si ottiene 4 + 1 + 1, cioè tre monete, mentre 3 + 3 ne richiede solo due.
Un metodo più sicuro consiste nel costruire la risposta a partire dagli importi più piccoli. Sia fewest[t] il minor numero di monete che sommano a t. Per pagare 0 non servono monete. Per ogni altro t, l'ultima moneta usata ha un certo valore c, e ciò che resta prima di usarla è t - c, quindi
fewest[t] = 1 + the smallest fewest[t - c] tra tutte le monete c il cui valore non supera t.
Per [1, 3, 4]: fewest[3] = 1 e fewest[6] = 1 + fewest[3] = 2. Se nessuna moneta porta a un importo raggiungibile, non è possibile pagare t.
Scrivi una funzione chiamata coinChange che riceva coins, un elenco di valori di monete distinti, e un intero amount, e restituisca il numero minimo di monete che totalizzano esattamente amount. Puoi usare ogni valore di moneta tutte le volte che vuoi. Restituisci -1 se non è possibile ottenere l'importo e 0 quando amount è 0.
Per esempio, coins = [2, 5, 10] e amount = 27 restituisce 4 (10 + 10 + 5 + 2), mentre coins = [4, 6] con amount = 7 restituisce -1.
Vincoli: 1 <= coins.length <= 12, 1 <= coins[i] <= 10^4, tutti i valori sono distinti, 0 <= amount <= 10^4.
Funzione
- arg1integer-array
- arg2integer
- Restituisceinteger
Esempi
- Input
- arg1 = [2, 5, 10]arg2 = 27
- Output
- 4
- Input
- arg1 = [4, 6]arg2 = 7
- Output
- -1
- Input
- arg1 = [3, 7]arg2 = 0
- Output
- 0
+12 test nascosti all’invio
Suggerimenti
Aprili uno alla volta. Ognuno rivela un po’ di più.
Prendere sempre la moneta più grande che ci sta non dà sempre il minor numero di monete. Prova con le monete
[1, 3, 4]e l'importo6.Supponi di conoscere già il numero minimo di monete per ogni importo inferiore a
t. Da quali importi inferiori si può raggiungeretcon una moneta in più?Riempi una tabella
fewest[0..amount]partendo da0:fewest[0] = 0, e ognifewest[t]è uno in più del migliorfewest[t - c]tra le monetec <= t. Contrassegna gli importi che non si possono raggiungere con un valore maggiore di qualsiasi risposta reale, ad esempioamount + 1, e trasformalo in-1alla fine.
Presto una spiegazione completa di questo problema.
Problemi simili
Problemi che usano le stesse idee. Risolverne due o tre è ciò che fissa uno schema.
Python
def coinChange(coins, amount):
# Scrivi il codice quiCaso 1
Caso 2
Caso 3
Input
arg1 = [2, 5, 10] arg2 = 27
Atteso
4