輸入包含多組數據。
每組數據包含一個正整數n(1≤n≤10000),即須要支付的金額。
對應每一組數據,輸出一個正整數,表示替換方式的種數。
4
13
思路:使用動態規劃來作,dp[i][j]表示前i種零錢換總金額爲j的方法種數:
若是第i種貨幣參與換算,那麼第i中貨幣可能有0個,1個,2個,3個...k個,dp[i][j] = dp[i-1][j] + dp[i-1][j-1*money[i]] + dp[i-1][j-2*money[i]] +...+ dp[i-1][j-k*money[i]],其中k*money[i] <= j
遞歸遞推公式:
dp[i][j] = dp[i-1][j] + dp[i-1][j-1*money[i]] + dp[i-1][j-2*money[i]] +...+ dp[i-1][j-k*money[i]],其中k*money[i] <= j
那麼,將j = j - money[i]進行替換,則
dp[i][j-money[i]] = dp[i-1][j-1*money[i]] + dp[i-1][j-2*money[i]] +...+ dp[i-1][j-k*money[i]],其中k*money[i] <= j
將上面兩個等式進行合併,那麼:
dp[i][j] = dp[i-1][j] + dp[i][j-money[i]]
若是第i種貨幣不參與換算,那麼:
dp[i][j] = dp[i-1][j]
最後代碼實現以下:
money=[1,5,10,25,50] dp = [] def getCount(n): for i in xrange(5): dp.append((n+1)*[0]) dp[i][0] = 1 for i in xrange(n+1): dp[0][i] = 1 for i in xrange(1,5): for j in xrange(1,n+1): if j < money[i]: dp[i][j] = dp[i-1][j] else: dp[i][j] = dp[i-1][j] + dp[i][j-money[i]] getCount(10000) while True: n = int(raw_input()) if n: print dp[4][n] else: break
優化:二維數組每次都是隻用到了2個數,那麼應該能夠用一維數組進行優化,它的表示是:dp[i]:總金額爲i的換零錢的方法數目。數組
dp[0] = 1,由題目意思可得app
dp[i] = dp[i-money[0]] + dp[i-money[1]] + dp[i-money[2]] + dp[i-money[3]] + dp[i-money[4]],其中i >= money[j],j=0..4優化
意思是,第i種狀態,由前面幾種狀態轉化而來的,相似於跳臺階。spa
代碼以下:code
money=[1,5,10,25,50] dp = [0] * 10001 dp[0] = 1 def getCount(n): for i in xrange(5): j = money[i] while j < n: dp[j] += dp[j-money[i]] j = j + 1 getCount(10001) while True: try: n = int(raw_input()) print dp[n] except: break