動態規劃 零錢問題 python

2021-09-12 21:56:29 字數 2898 閱讀 5055

零錢問題:

暴力遞迴:

遞推關係:對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 程式設計任務 設計乙個動態規劃演算...