對動態規劃,零錢問題的轉移方程的理解

2021-09-26 14:17:24 字數 858 閱讀 3026

問題描述:

1、找零錢問題

有陣列penny,penny中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim(小於等於1000)代表要找的錢數,求換錢有多少種方法。

給定陣列penny及它的大小(小於等於50),同時給定乙個整數aim,請返回有多少種方法可以湊成aim。

測試樣例:

[1,2,4],3,3

返回:2

設dp[n][m]為使用前n種貨幣湊成m的種數,需要注意的是,說使用前n種,在這裡,每種貨幣使用張數是沒有限定的,可以為0,也就是說可以只使用n種的若干中貨幣。在明確這點的情況下,dp[n][m]在是否使用第n種貨幣的時,有兩種情況:

1,不使用第n種貨幣:dp[n][m]=dp[n-1][m], 這個很好理解,假如m2,使用第n中貨幣:dp[n][m]=dp[n-1][m]+dp[n][m-penny[n]],分析一下為什麼是這樣秒首先拆開兩部分:

dp[n-1][m]表示只用前n-1中貨幣湊成m,因為前面說過使用前n中貨幣是沒有限定每種使用數量的,這裡就是第n種貨幣數量為0的情況。dp[n][m-penny[n]]表示至少使用一張第n中貨幣湊成m的種數,通過將m減去penny[n],其實就是強行使用了一張n貨幣,在這種前提下,一切組合都滿足使用第n種貨幣。所以這裡dp[n][m-penny[n]千萬不要寫成dp[n-1][m-penny[n],這麼寫就是僅使用一張第n貨幣,二者差別很大。

轉移方程:dp[n][m]=dp[i-1][j] (jdp[n][m]=dp[i-1][m]+dp[i][j-penny[i]] (j>=penny[i])

有了以上的轉移方程,只要做兩層迴圈,每次判斷j與penny[i]的大小就可以了。

動態規劃零錢問題

問題 給你 k 種面值的硬幣,面值分別為 c1,c2 ck,每種硬幣的數量無限,再給乙個總金額 amount,問你最少需要幾枚硬幣湊出這個金額,如果不可能湊出,演算法返回 1 比如說 k 3,面值分別為 2,5,10,總金額 amount 11。那麼最少需要 4枚硬幣湊出,即 11 5 2 2 2。...

動態規劃 , 零錢問題。

動態規劃 核心思想,找到最優子結構,組合子問題構成原問題的解。最重要的是,找到最優子結構,這是最難的部分 例題 我們有面值為1元3元5元的硬幣若干枚,如何用最少的硬幣湊夠11元?首先找到問題的子結構 1 選擇硬幣作為子結構變數,第一次選擇只有1元硬幣,求出構成11元硬幣的方案集合a1,第二次選擇有1...

動態規劃 零錢問題 python

零錢問題 暴力遞迴 遞推關係 對arr index 的使用的次數情況進行列舉,for int i 0,arr index i aim,i 對於每乙個i都對應乙個列舉的情況,在該列舉情況下可以重新調整引數,此時可以使用的零錢陣列是arr中index 1開始及之後的陣列部分,新的目標值是aim aim ...