В настоящее время я работаю над книгой по разработке алгоритмов и натолкнулся на вопрос, в соответствии с которым вы должны реализовать жадный алгоритм с динамическим программированием для решения проблемы замены монет.
Я пытался реализовать это, и я просто не могу понять или понять алгоритм, приведенный в моей книге. Алгоритм следующий (с моим (отсутствие) понимания в комментариях):
Change(p) {
C[0] = 0
for(i=1 to p) //cycling from 1 to the value of change we want, p
min = infinity
for(j=1 to k( //cyle from 1 to...?
if dj <=i then
if(1+C[i-dj] < min) then
min = 1+C[i-dj]
endif
endif
endfor
C[i] = min
endfor
return C[p]
}
И моя попытка интерпретации происходящего:
/**
*
* @param d
* currency divisions
* @param p
* target
* @return number of coins
*/
public static int change(int[] d, int p) {
int[] tempArray = new int[Integer.MAX_VALUE]; // tempArray to store set
// of coins forming
// answer
for (int i = 1; i <= p; i++) { // cycling up to the wanted value
int min = Integer.MAX_VALUE; //assigning current minimum number of coints
for (int value : d) {//cycling through possible values
if (value < i) {
if (1 + tempArray[i - value] < min) { //if current value is less than min
min = 1 + tempArray[1 - value];//assign it
}
}
}
tempArray[i] = min; //assign min value to array of coins
}
System.out.println("help"); // :(
return tempArray[p];
}
Может кто-нибудь объяснить мне, что мне не хватает, как это исправить и как этот алгоритм должен работать? Динамическое программирование кажется таким полезным инструментом, но я не могу разобраться с этим. Я продолжаю мыслить рекурсивно.