零錢問題:
暴力遞迴:
遞推關係:對arr[index]的使用的次數情況進行列舉,for(int i=0,arr[index]*i<=aim,i++),對於每乙個i都對應乙個列舉的情況,在該列舉情況下可以重新調整引數,此時可以使用的零錢陣列是arr中index+1開始及之後的陣列部分,新的目標值是aim=(aim-arr[index]*i),於是呼叫遞迴方法dp(arr,index+1,aim-arr[index]*i)即可返回當前列舉條件下的方案數目,對每一種情況下的方案數目進行累加即可得到總的方案數目。
邊界條件:可以發現其實邊界條件,就是思考什麼時候滿足拼湊,什麼時候不能夠實現拼湊,顯然,當遞迴到aim=0時表名可以拼湊出目標值,當 aim小於0的時候表名該方法不能得到目標值,遞迴的邊界條件就是當index==length時判斷aim==0是否成立,若成立+1,否則+0
class exchange:
def countways(self, penny, n, aim):
if len(penny)<=0 or aim<0:
return 0
else:
return(self.pl(penny,0,aim))
def pl(self,arr,index,aim):
res= 0
if index == len(arr):
if aim == 0:
res = 1
else:
res = 0
else:
i = 0
while arr[index]*i<=aim:
res = res+self.pl(arr,index+1,aim-arr[index]*i)
i = i+1
return res
//測試**
penny = [1,2,4]
n = 3
aim = 3
a = exchange()
print(a.countways(penny,n,aim))
記憶查詢
# -*- coding: utf-8 -*-
class exchange:
def countways(self, penny, n, aim):
# write code here
if len(penny)<=0 or aim<0:
return 0
else:
dic = {}
for index in range(n+1):
for a in range(aim+1):
dic[(index,a)] = 0
#print('dic_ori=',dic)
return(self.pl(penny,0,aim,dic))
def pl(self,arr,index,aim,dic):
res= 0
if index == len(arr):
if aim == 0:
res = 1
else:
res = 0
else:
i = 0
value = 0
while arr[index]*i<=aim:
value = dic[(index+1,aim-arr[index]*i)]
if value!=0:
res = res+value
else:
res = res+self.pl(arr,index+1,aim-arr[index]*i,dic)
i = i+1
if res!=0:
dic[(index,aim)] = res
#print('dic=',dic)
return res
penny = [1,2,4]
n = 3
aim = 3
a = exchange()
print(a.countways(penny,n,aim))
動態規劃
動態規劃零錢問題
問題 給你 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
問題描述 設有n種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t 1 t 2 t i 時,可找出錢數j的最少硬幣個數記為c i,j 若只用這些硬幣面值,找不出錢數j時,記c i,j 程式設計任務 設計乙個動態規劃演算...