題目:假設銀行裡一共有n種硬幣,第一種硬幣的價值為v1。假設想把k元兌換成零錢,一共有多少種兌換方案。
例如,一共有1,2,5三種硬幣,k = 5,則有以下兌換方案:11111,1112,122,5。共有4中兌換方案。
動態規劃問題最重要的是要找到狀態轉移方程!!!
用dp[i][sum]表示使用前i種硬幣來組合sum這些錢有多少種兌換方案。那麼
dp[i][sum] = dp[i-1][sum - 0*vi] + dp[i-1][sum-1*vi]+...+dp[i-1][sum-k*vi]
其中k = sum / vi
理解:拿sum=6,i=3來解釋一下。其中v1=1,v2=2,v3=5,也就是vi=5。而dp[3][6]就等於在不使用5這個硬幣的時候有多少種組合方式加上使用乙個5硬幣有多少種組合方式。因為sum=6,最多只能有乙個5硬幣,所以k=1。
**如下
int coincombinations(int coins, int coinkinds, int sum)
for (int i = 1; i <= coinkinds; ++i)}}
return dp[coinkinds][sum];
}
硬幣組合問題 動態規劃
如果我們有面值為1元 3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?表面上這道題可以用貪心演算法,但貪心演算法無法保證可以求出解,比如1元換成2元的時候 首先我們思考乙個問題,如何用最少的硬幣湊夠i元 i 11 當i 0,即我們需要多少個硬幣來湊夠0元。由於1,3,5都大於0,即沒有比0小的幣...
動態規劃之硬幣組合問題
問題 如果我們有面值為1元 3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?動態規劃的本質是將原問題分解為同性質的若干相同子結構,在求解最優值的過程中將子結構的最優值記錄到乙個表中以避免有時會有大量的重複計算。例如硬幣組合問題,若求湊夠11元的最少硬幣數,可以先從湊夠0元 1元 2元 的子結構開...
動態規劃問題之求組合數
我們知道,組合數在組合數學中非常有用,組合數是乙個十分常用的數字。比如,書架上有4本書abcd,我們想拿2本讀,那麼有c 4,2 種方法。這個數字的求法是 4!2!4 2 其中n!1 2 3.n,是階乘數。所以按定義求其實也十分 容易 這裡是指容易寫罷了。先求乙個階乘 def fac n if n ...