問題來自sicp,描述如下這是介紹線性遞迴這個概念的時候的乙個例子,很有意思。現在若干紙幣,想要兌換成硬幣。硬幣面值有1, 5, 10, 25, 50分的硬幣。什麼,沒有25分的,我說的是美元。。。
問有多少種組合方式
演算法嘛,很樸素啊,其主要思想如下
scheme的**就不貼上來了,太簡單太抽象。我們還是用c++吧
#include
#include
using
namespace
std;
int coin_value=;
int coin_count=;
int entry_count;
int* matrix;
int cc(int money, int coin_type,int lr)
if (money ==0)
else
if ((money<0) || (coin_type==0))
// else if (matrix[money*6+coin_type] >=0)
//
else
// cout<<"("<< setw(4) }int main()
上面**用標準遞迴,被注釋掉的那塊else if**是查詢已經計算過的節點的值,用來減少遞迴呼叫次數。
金額(美分)
10100
200500
組合方式
4292
2435
59576
查詢表方式遞迴次數
31289
5811457
簡單遞迴方式遞迴次數
4115499
229589
12822611
可以看到用查詢表方式,演算法的時間複雜度是o(n),簡單遞迴的時間複雜度是o(n^m)。不過查詢表方式 空間複雜度是o(n*m),簡單遞迴的空間複雜度是o(n+m)。其中,n是金額,m是硬幣種類數。
那麼,如果我們想知道每種組合的具體配置,how?
換零錢 見解
n元錢換為零錢,有多少不同的換法?幣值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元。例如 5分錢換為零錢,有以下4種換法 1 5個1分 2 1個2分3個1分 3 2個2分1個1分 4 1個5分 由於結果可能會很大,輸出mod 10 9 7的結果 input 輸入1個數n,n...
換零錢的clojure實現
題目 有半美元 四分之一美元 10美分 5美分和1美分的硬幣,將1美元換成零錢,一共有多少種不同方式?思路 首先我們把1美元變成100美分,半美元變成50美分,四分之一美元變成25美分。然後從硬幣的最大面額 50美分開始 100餘額的所有換法 採用50美分的所有換法 不採用50美分的所有換法 那麼,...
力扣 兌換零錢
題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1 通過動態規劃來進行求解 首先可以將問題拆分成相等的子問題,假設dp n 等於構成n元的最少的硬幣數,那麼dp n dp n m dp...