硬幣面值組合(上台階)

2021-07-12 04:53:33 字數 1333 閱讀 6070

假設我們有8種不同面值的硬幣{1,2,5,10,20,50,100,200},用這些硬幣組合夠成乙個給定的數值n。問總過有多少種可能的組合方式? 類似的題目還有:

[華為面試題] 1分2分5分的硬幣三種,組合成1角,共有多少種組合

[創新工廠筆試題] 有1分,2分,5分,10分四種硬幣,每種硬幣數量無限,給定n分錢,有多少中組合可以組成n分錢

深度搜尋解答樹

#include#includeusing namespace std;

int coin[4] = ;

vectorsolution;

int cnt = 0;

int sum = 0;

int target = 0;

void dfs(int index)

for (int i = index; i < 4; i++)

}int main()

結果為4

給定乙個數值sum,假設我們有m種不同型別的硬幣,如果要組合成sum,那麼我們有

sum = x1 * v1 + x2 * v2 + ... + xm * vm 

求所有可能的組合數,就是求滿足前面等值的係數的所有可能個數。

dp[i][sum] = 用前i種硬幣構成sum 的所有組合數。

那麼題目的問題實際上就是求dp[m][sum],即用前m種硬幣(所有硬幣)構成sum的所有組合數。

dp[i][sum] = dp[i-1][sum - 0*vm] + dp[i-1][sum - 1*vm]

+ dp[i-1][sum - 2*vm] + ... + dp[i-1][sum - k*vm]; 其中k = sum / vm

那麼初始情況是什麼呢?如果sum=0,那麼無論有前多少種來組合0,只有一種可能,就是各個係數都等於0;

dp[i][0] = 1   // i = 0, 1, 2, ... , m

我們規定為dp[0][sum] = 0. 

#include#includeusing namespace std;

int coincombination(int coin, int coinkinds, int target)

dp[0][target] = 0;

for (int i = 1; i <= coinkinds; i++)

} }return dp[coinkinds][target];

}int main();

cout << coincombination(coin, 4, 5) << endl;

return 0;

}

動態規劃 硬幣面值組合(上台階)

不難發現,此題就是完全揹包問題。同時也是fibonacci的動態規劃解法,所有有必要進行深入理解。動態規劃 dp i sum 用前i種硬幣構成sum 的所有組合數。狀態轉移方程 dp i sum dp i 1 sum 0 vm dp i 1 sum 1 vm dp i 1 sum 2 vm dp i...

上台階問題

問題描述 現在小瓜想通過台階走上平台,最底層 小瓜所在的層 編號為1,最頂層編號為n。由於小瓜的腿比較短,他一次只能向上走1級或者2級台階。小瓜想知道他有多少種方法走上平台,你能幫幫他嗎?輸入 乙個整數n,其中2 n 25。輸出 一行乙個整數,表示小瓜上台階的方案數 資料範圍 對於12 的資料,2 ...

賽碼 上台階(C )

設定人現在在台階1層,每次只能上1層到兩層,到台階1層有0種走法,到台階2層有1種走法,到台階3層有2種走法,這樣我們已經知道底部子問題的解。f n f n 1 f n 2 比如說4層只能由2層 跨兩步 或3層到達 跨1步 因此4層的走法數應該是2層走法數和3層走法數的和。使用乙個陣列來儲存到某個台...