問題很常見吧!就是給定乙個錢數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 ...