題目:有半美元、四分之一美元、10美分、5美分和1美分的硬幣,將1美元換成零錢,一共有多少種不同方式?
思路:首先我們把1美元變成100美分,半美元變成50美分,四分之一美元變成25美分。然後從硬幣的最大面額
50美分開始:
100餘額的所有換法 = 採用50美分的所有換法 + 不採用50美分的所有換法
那麼,我們首先來看採用50美分的換法,既然採用了50美分,那麼至少得用乙個,換句話說,
我們就可以把問題轉換為計算餘額為100-50=50美分的所有換法:
100餘額採用50美分的所有換法 = 50餘額的所有換法
而:50餘額的所有換法 = 採用50美分的所有換法 + 不採用50美分的所有換法
這兒就遞迴到了採用50美分的所有換法,我們再次減去50美分時,餘額為0,就代表有了一種換法,應該返回1;
這時,我們再返回餘額為50時,不採用50美分的所有換法上面,那麼,我們會取用除了50之外的最大面額25:
50餘額不採用50美分的所有換法 = 採用25美分的所有換法 + 不採用25美分的所有換法
看著是不是很眼熟了呢?很明顯,我們又可以進行遞迴了。
50餘額採用25美分的所有換法 = 25餘額的所有換法
而:25餘額的所有換法 = 採用25美分的所有換法 + 不採用25美分的所有換法
如上所述,我們可以發現,遞迴終止的條件有兩個,乙個是餘額,另乙個是硬幣的數量。如果餘額為0,則代表
有一種換法,返回1,餘額為負,則代表這種換法不可行,返回0。硬幣的數量為什麼是遞迴的終止條件呢,因為
我們會不斷根據當前餘額去取在硬幣集合中離當前餘額面值最近的硬幣,如果沒有更多地硬幣了,那麼當然應該
終止遞迴。
程式如下:
user> (defn lq [x] ;定義硬幣(cond (= 1 x) 1
(= 2 x) 5
(= 3 x) 10
(= 4 x) 25
(= 5 x) 50))
user> (defn clq [a x] ;定義遞迴演算法
(cond (zero? a) 1 ;如果餘額為0,則說明有一種換法
(or (neg? a) (zero? x)) 0 ;如果餘額為負或者已經取完硬幣,則說明沒有換法
:else (+ (clq a (dec x)) (clq (- a (lq x)) x))))
user> (clq 100 5) ;兩個引數為要換的金額和最大硬幣數量
292
換零錢 見解
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...
換零錢的演算法
問題來自sicp,描述如下 現在若干紙幣,想要兌換成硬幣。硬幣面值有1,5,10,25,50分的硬幣。什麼,沒有25分的,我說的是美元。問有多少種組合方式 這是介紹線性遞迴這個概念的時候的乙個例子,很有意思。演算法嘛,很樸素啊,其主要思想如下 scheme的 就不貼上來了,太簡單太抽象。我們還是用c...
力扣 兌換零錢
題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1 通過動態規劃來進行求解 首先可以將問題拆分成相等的子問題,假設dp n 等於構成n元的最少的硬幣數,那麼dp n dp n m dp...