銀幣組合演算法分析

2021-05-24 14:22:05 字數 782 閱讀 5665

[題目]有足夠量的2分、5分、1分硬幣,請問湊齊1元錢有多少種方法?

此題乍看上去,只會覺得完全無法入手,但是按照由簡至繁的思路,我們可以先考慮極端簡單的情況,假如把問題規模縮小成:有足夠量的1分硬幣,請問湊齊1分錢有多少種方法?毫無疑問,答案是1。

得到這一答案之後,我們可以略微擴大問題的規模: 有足夠量的1分硬幣,湊齊2分錢有多少種方法?湊齊n分錢有多少種方法?答案仍然是1

接下來,我們可以從另乙個角度來擴大問題,有足夠量的1分硬幣和2分硬幣,湊齊n分錢有多少種方法?這時我們手裡已經有了有足夠量的1分硬幣,湊齊任意多錢都只有1種方法,那麼只用1分錢湊齊n-2分錢,有1種方法,只用1分錢湊齊n-4分錢,有1種方法,只用1分錢湊齊n-6分錢,有1種方法......

而湊齊這些n-2、n-4、n-6這些錢數,各自補上2分錢,會產生一種新的湊齊n分錢的方法,這些方法的總數+1,就是用1分硬幣和2分硬幣,湊齊n分錢的方法數了。

在面試時,立刻採用這種思路是一種非常有益的嘗試,解決小規模問題可以讓你更加熟悉問題,並且慢慢發現問題的特性,最重要的是給你的面試官正面的訊號——立即動手分析問題比皺眉冥思苦想看起來好得多。

對於此題而言,我們可以很快發現問題的規模有兩個維度:用a1-ak種硬幣和湊齊n分錢,所以我們可以記做p(k,n)。當我們發現遞迴公式 p(k,n) = p(k-1,n - ak) + p(k-1,n - 2*ak) + p(k-1,n - 3*ak) ... ... 時,這個問題已經是迎刃而解了

通常由簡至繁的思路,用來解決動態規劃問題是非常有效的,當積累了一定量簡單問題的解的時候,往往通向更高一層問題的答案已經擺在眼前了。

組合演算法實現

組合 乙個集的元素的組合是乙個子集。s的乙個k 組合是s的乙個有k個元素的子集。組合具有無序性。若兩個子集的元素完全相同僅順序不同,看作同乙個組合。組合符號 這裡介紹4中常見的組合形式 1.完全組合。2.不重複完全組合。3.選擇組合。4.有重複選擇組合。1.完全組合 從n元素集s中取出所有的k個元素...

遞迴組合演算法

遞迴組合演算法 演算法思想 對於乙個長度為m的序列,要求n個數的組合。1.從索引最小的元素遍歷到第n m個元素,將遍歷到的元素定為組合中的第乙個元素 2.判斷組合中n個元素是否已滿,如果滿了,列印該組合,如果不滿重,則擷取1中選擇的元素之後的序列,復步驟一。include include using...

排列組合演算法

在開發的過程中很難免會到排列組合,剛開始通過for迴圈來搞定。但是對於工作了近五年的我而已,不能像 新人那樣做了。如果所要組合的集合大於40,你不可能寫40個for迴圈吧!這裡使用了數學的演算法,到底是啥演算法,高人也沒說!不過我把它的思想提公升了一下。如下 ifndef combination h...