這題很典型是動態規劃問題,為什麼呢?
首先我們可以看一下什麼問題可以被看做動態規劃問題。
因此動態規劃的精髓在於,充分利用上一次的計算結果來達成本次快速計算的目的
ok, 一般我們解決動態規劃問題可分為三步走;
分析問題的狀態時,不要分析整體,只分析最後乙個階段即可!因為動態規劃問題都是劃分為多個階段的,各個階段的狀態表示都是一樣,而我們的最終答案在就是在最後乙個階段。
對於這道題,最後乙個階段是什麼呢?
我在思考的這道題的時候就覺得本題最重要在於 1,1,1,1 怎麼過渡到 5,它是怎麼從
coin[1, 5, 10, 25] 逐個階層進行跳躍的,
經過我的反覆看書本的解題思路發現,首先無論你要找的數額是多少,先把它和coin[0] = 1
相減這是個不斷的遞迴的過程,然後就進入到了遞迴的最深層,我們開始返回結果,返回的結果會正式進入我們對coin[1, 5, 10, 25]的迴圈,返回的結果會直接從coin[1]開始做乙個減法,減法的結果進行判斷,小於零會進入coin[2]繼續,大於等於零我們就裝入我們的快取陣列裡面,就以數5為例,5 - 5 == 0,第一次引用快取中的 [ ], 後面10 - 5也會引用我們的[ 5 ], min = [coin].concat(newmin); 從此開始每一次對快取陣列中的值的引用得到的都是之前最優解和當前最優解的合併,通過快取陣列我們就能直接獲取值不用再像判斷出第乙個5時進行重複的計算,而這也是明顯的動態規劃的體現。
if
(cache[value]
)
據此我們陣列就將會儲存到 n的最佳解 動態規劃 最小硬幣找零
用的硬幣面額d1 dn 及其數量,找出有多少種找零方法。最少硬幣找零問題是給出要找零的錢數,以及可用的硬幣面額d1 dn 及其數量,找到所需的最少的硬幣個數。最小硬幣找零 function mincoinchange coins var cache this.makechange function ...
硬幣找零問題(動態規劃)
給定指定的硬幣種類,面值為 1,3,5 在此具體化些 給定所找零的錢數 sum,給出最少的硬幣找零數,每個種類的硬幣無限使用。看到這問題,當時我想到用貪心演算法來求解,最後求解方案因為巧合對了,後來在網上看到動態規劃的題目,才知道貪心演算法得不到最優解,比如 給定 面值為 1,3,4,給定找零數為 ...
硬幣找零問題 動態規劃問題
看到了 這文章,由於我不太懂他的 所以我按他的題和思路,寫了 思路我就不寫了,就是動態規劃的思路,先保證區域性最優,再慢慢向全區域性最優 include include include include using namespace std const int m 100 int coinsum m...