Non riesco a trovare la mia ultima sezione di codice per un problema di modifica dinamica delle monete. Ho incluso il codice qui sotto.Programmazione dinamica - modifica apportata
Non riesco a capire l'ultimo else
. Dovrei semplicemente usare l'algoritmo greedy a quel punto o posso calcolare la risposta dai valori già presenti nella tabella? Ho lavorato duramente per cercare di capire questo problema e penso di essere abbastanza vicino. Il metodo trova la quantità minima di monete necessarie per creare una certa quantità di cambiamenti creando una tabella e usando i risultati che sono memorizzati nella tabella per risolvere il problema più grande senza ricorrere alla ricorsione.
public static int minCoins(int[] denom, int targetAmount){
int denomPosition; // Position in denom[] where the first spot
// is the largest coin and includes every coin
// smaller.
int currentAmount; // The Amount of money that needs to be made
// remainingAmount <= initalAmount
int[][] table = new int[denom.length][targetAmount+1];
for(denomPosition = denom.length-1 ; denomPosition >= 0 ; denomPosition--) {
for(currentAmount = 0 ; currentAmount <= targetAmount ; currentAmount++){
if (denomPosition == denom.length-1){
table[denomPosition][currentAmount] =
currentAmount/denom[denomPosition];
}
else if (currentAmount<denom[denomPosition]){
table[denomPosition][currentAmount] =
table[denomPosition+1][currentAmount];
}
else{
table[denomPosition][currentAmount] =
table[denomPosition+1][currentAmount]-
table[denomPosition][denom[denomPosition]]-1;
}
}
}
return table[0][targetAmount];
}
il metodo funziona ma non aiuta la mia comprensione del problema se tu o qualcun altro commenti sulle linee chiave del codice vedo i cicli for per denomPosition e currentAmount ma dopo questo perde ogni somiglianza con il mio programma originale. Grazie per l'aiuto. –
La mia implementazione si basa sul problema "Making change" spiegato in [here] (http://people.csail.mit.edu/bdean/6.046/dp/), dovrebbe essere chiaro dopo aver visto il video nel link –