遞迴運用 錢幣系統問題

2021-10-14 09:35:26 字數 1701 閱讀 3483

問題:(錢幣系統問題) 某錢幣系統由 k (k≤20) 種硬幣組成,幣值依次為 a[1]、 a[2]、……、a[k], 其中 a[i] (i=1,2,……,k) 為互不相同的正整數,且依降序排列, a[1]≤200。給定某整數幣值 n(n≤3000), 要求用最少枚數的硬幣表示這個幣值。輸入格式為:

第1行:k (硬幣種數)

第2行:a[1]、 a[2]、 … a[k] (各幣值用空格隔開,已按降序排列好)

第3行:n (給定的幣值)

直接在螢幕上輸出結果。如果該錢幣系統無法表示幣值 n,應輸出「no」。

否則按以下格式輸出:

第 1 行: 最少錢幣枚數 r

第 2 行: 輸出若干形如 m*n 的表示式, m 為幣值, n為使用該幣值的枚數,各式第 2 個因子之和應等於 r,各式乘積之和應等於 n。

例: 設 (a[1],a[2],a[3])=(5,2,1), n=12, 則應輸出

3

5*2 2*1

考慮再三,感覺用遞迴會要簡單很多。

解題思路:

1、先用最大幣值,能夠用幾個就幾個,用完一種幣值後,餘額再分給次大幣值,依次類推,直到餘額為0。

2、如果按步驟1不能解決問題,把最新分配失敗的幣值數量減少乙個,按步驟1處理,直到餘額為0。如果再不行,再減乙個,再依次類推,直至本次不使用該種幣值,返回到上乙個較高幣值進行相同試嚐,如果返回到最大幣值試嚐失敗,就放棄最大幣值,依次類推。如果最終未找到分配方案,輸出「no」。

3、尚不能完全肯定,遞迴後第乙個獲得的結果就是完全正確的。讀者可以自行在此程式上稍加改進,把遞迴所有結果進行比較,找到那個符合題意的答案。

#include

#include

using

namespace std;

deque<

int>coin_base, coin_num;

int k, n, a[21]

;void

dfs(

int m,

int number,

int surplus)

if(m == k)

return

; coin_base.

push_back

(a[m +1]

);coin_num.

push_back

(surplus / a[m +1]

);dfs(m +

1, surplus / a[m +1]

, surplus % a[m +1]

);coin_base.

pop_back()

; coin_num.

pop_back()

;if(number -

1>=0)

}int

main()

cout <<

"no"

<< endl;

}

執行結果:

3

7 5 3164

7*1 3*3

10

150 121 119 113 23 15 11 7 5 3

2021

18150*13 23*2 15*1 7*1 3*1

3

11 7 5

13no

HDU 1284 錢幣兌換問題(遞迴)

題目 define maxsize 32768 int cnt maxsize 4 int partition int n,int m if 1 m 1 n if 1 m 1 n if n m if n m return cnt n m partition n,m 1 partition n m,m...

運用遞迴解決二叉樹問題

二叉樹的各種遍歷方法可以參考我的部落格 二叉樹的各種遍歷方法。給定乙個二叉樹,找出其最大深度。二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。說明 葉子節點是指沒有子節點的節點。definition for a binary tree node.class treenode def init...

運用遞迴解決漢諾塔問題(Python 3 0)

漢諾塔 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。具體 如...