我目前正在阅读一本关于算法设计的书,遇到了一个问题,即您必须使用动态规划实现一个贪心算法来解决硬币找零问题。
我试图实现这一点,但我无法弄清楚或理解我书中给出的算法。该算法如下(在评论中我(缺乏)理解):
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];
}
有人可以向我解释我缺少什么,如何解决这个问题,以及这个算法应该如何工作?动态编程似乎是一个非常有用的工具,但我无法理解它。我一直在递归地思考。