我目前正在通過一本關於算法設計的書,並且遇到了一個問題,您必須通過動態編程實現貪婪算法來解決硬幣更換問題。開始動態編程 - 貪婪硬幣更換幫助
我試圖實現這一點,我只是無法弄清楚或理解我的書中給出的算法。該算法如下(我的(缺乏)的瞭解,評論):
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];
}
可有人請向我解釋什麼,我缺,如何解決這個問題,以及這個算法應該如何工作?動態編程似乎是一個很有用的工具,但我無法理解它。我一直在遞歸地思考。
我想了解在這種情況下術語「動態編程」的用法;你可以解釋嗎? –
動態規劃是一種解決以前的解決方案用於計算以後解決方案的問題的技術。一般的硬幣更換問題是,給定一個指定面額的硬幣和一個數字N是什麼是需要改變N的最小硬幣數量。 –
「用動態規劃實現貪婪算法」 - 它可以是貪婪算法或DP算法... – IVlad