換零錢的演算法

2021-07-11 15:08:08 字數 1112 閱讀 6364

問題來自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...