硬幣找零 遞迴備忘錄解法

2021-10-11 08:36:09 字數 814 閱讀 1356

問題很常見吧!就是給定乙個錢數n,然後給定乙個k種硬幣

然後輸入硬幣的面值,然後求出最少的硬幣來湊出這個錢數

例如:11塊

有三種硬幣 1 2 5

那麼最少數就是 3(兩個5和乙個1)

#include

#include

#include

#include

using

namespace std;

intdp

(int n,vector<

int>

&coin,vector<

int>

&memo)

;int

main()

//定義乙個備忘錄 ,初始化大小為錢數+1,初始值為0代表沒有儲存資料

vector<

int>

memo

(money+1,

0);//易錯點memo的大小不要越界

cout <<

dp(money,coin,memo)

;return0;

}intdp(

int n,vector<

int>

&coin,vector<

int>

&memo)

// 把最優解存入備忘錄

memo[n]

= ans;

return memo[n]

;}

這裡有兩點需要注意的:(也是筆者犯錯的兩個地方):

不太能理解的話,就畫出遞迴樹,遞迴問題畫圖更容易幫助我們理解。

斐波那契數列 遞迴備忘錄解法(簡單理解)

1.如果讓我們遞迴解決,我們通常使用這一段 來解決斐波那契數列問題 int fib int n 確實簡單又好懂,可是這段 細思極恐,時間複雜度是指數級的o 2n 這可了不得。那麼為什麼它的時間複雜度這麼高呢?我們畫出遞迴樹 注意 fib8 和fib8是一樣的,筆者不太會用這個圖所以只能這樣了。我們可...

動態規劃 備忘錄方法 遞迴方法

動態規劃的基本思想是,將原問題拆分為若干子問題,自底向上的求解。其總是充分利用重疊子問題,即通過每個子問題只解一次,把解儲存在乙個表中,巧妙的避免了子問題的重複求解。遞迴方法,採用的是自頂向下的思想,拆分為若干子問題,但是造成了子問題的重複求解。備忘錄方法,採用的也是自頂向下的思想,但是該方法維護了...

遞迴備忘錄法 leetcode 72編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...