動態規劃5 找零錢問題

2021-08-03 21:02:49 字數 1868 閱讀 9796

題目:

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

樣例:[1,2,4],3,3  返回:2(即1 1 1,1 2)

思路:

表[n][aim+1]記錄子問題結果,dp[i][j]表示錢為j,且貨幣為penny[0...i]種時,共有的找錢方式。

目標值從aim=0開始

將這個問題分解成為n行,aim+1列的矩陣dp[n][aim+1],矩陣中每個值dp[i][j]:arr[0~i]來拼湊出目標值j的方案數目,於是將複雜問題轉化成為了n*(aim+1)個子問題。

初始條件,可知dp[i][0]=1,對於第一行dp[0][j],表示只用arr[0]這種貨幣進行拼湊,那麼只有該貨幣的整數倍的錢數才能拼湊成功。所以dp[0][j]=1(j是arr[0]的倍數),否則dp[0][j]=0。

對於任意的乙個值dp[i][j]表示使用arr[0~i]的元素來拼湊出目標值為j的方案數目,總結規律可以發現:dp[i][j]=dp[i-1][j]+dp[i-1][j-arr[i]]+dp[i-1][j-arr[i]*2]+……即arr[i]選0,1,2,...個時的情況

對動態規劃矩陣中的計算順序路徑作出規定,只有按行從上到下,每行從左到右進行計算,才能保證在計算dp[i][j]時dp[i-1][j]+dp[i-1][j-arr[i]]+dp[i-1][j-arr[i]*2]+……都已經計算出來,否則就無法解決問題。因此在本問題中,在計算出了第一行第一列的結果dp[i][j]之後,對之後的dp[i][j]不能隨意計算,必須按照從第1行第2列開始逐行逐列地進行計算,可以使用乙個雙層遍歷來進行計算所有值。當所有dp[i][j]計算完成後,矩陣右下角的元素值dp[n-1][aim]就是所求的結果值。

總結:

對於任意乙個dp[i][j]在求解的過程中,需要對i-1行中的若干個結點值進行求和運算,即要通過乙個迴圈函式按照for(int k=0,k*arr[i]總的時間複雜度是o(n*aim^2);

例如對於上面dp[i][j]=dp[i-1][j]+dp[i-1][j-arr[i]]+dp[i-1][j-arr[i]*2]+……的計算過程可以進行進一步的簡化,分析發現,例如圖中所示,dp[i-1][j-arr[i]]+dp[i-1][j-arr[i]*2]的計算結果就是dp[i][j-arr[i]]的計算結果,於是dp[i][j]= dp[i-1][j]+ dp[i][j-arr[i]],同時由於這2項都出現在dp[i][j]的計算順序之前,因此可以直接拿來使用,因此對於每一項dp[i][j]在計算時省去了遍歷列舉的過程,於是每乙個dp[i][j]的計算時間複雜度降低為o(1),因此總的時間複雜度降低為o(n*aim)。這個規律是因為計算時嚴格按照逐行逐列路徑進行計算時才有的,因此使用動態規劃時按照固定路徑進行計算可以為進一步的優化帶來可能。

public class exchange else}}

return dp[n-1][aim];}}

用一維陣列:每一列看成一維

public class exchange 

for(int i=1;i=penny[i]) dp[j]=dp[j-penny[i]]+dp[j];}}

return dp[aim];}}

動態規劃 找零錢問題 收藏

view plaincopy to clipboardprint?include using namespace std const int m 1000 const int n 3 int coint n int count m 1 count i 表示湊合數量為i所需最少的錢幣數量,則count...

找零錢問題 動態規劃 python

問題描述 設有n種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t 1 t 2 t i 時,可找出錢數j的最少硬幣個數記為c i,j 若只用這些硬幣面值,找不出錢數j時,記c i,j 程式設計任務 設計乙個動態規劃演算...

動態規劃系列(2) 找零錢問題

refer tom在自動售貨機上買了一瓶飲料,售價37美分,他投入了1美元 1美元 100美分 現在自動售貨機需要找錢給他。售貨機中現在只有四種面額的硬幣 1美分 5美分 10美分 25美分,每種硬幣的數量充足。現在要求使用最少數量的硬幣,給tom找錢,求出這個最少數量是多少。自動售賣機需要給tom...