動態規劃 零錢兌換問題 動態規劃解題思路總結

2021-10-05 10:57:57 字數 2561 閱讀 9062

今天大俠要討論的題目是:【零錢兌換問題】

這是一道經典的動態規劃問題. 此題目中,你將會看到動態規劃全域性最優解的體現。以及常見動態規劃解題思路總結。

零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。

如果沒有任何一種硬幣組合能組成總金額,返回 -1。

示例 1:

以上問題我們也可以用貪心演算法(每次選擇盡可能大的數值)來解釋:

但是如果零錢集合是[1,5,7] 要配出的金額為10

則貪心演算法會選擇7和1,共需要4枚硬幣

7 x1

+1x3

=10

7x1+1x3 =10

7x1+1x

3=10

但是最優解是選擇5, 共需要2枚硬幣

5 ∗2

=10

5*2=10

5∗2=10

由此可見,使用動態規劃考慮全域性問題是非常有必要的。

解決動態規劃問題 主要分為以下三步:

目標(objection)

定義狀態(define status)

轉化方程(transform equation)

下面和大俠一起分析下這個問題吧!

目標 :湊成總金額所需的最少的硬幣個數

定義狀態:m(j)表示湊成j金額 所需的最少的硬幣個數

轉化方程:

m [j

+1]=

min( ~m[j-coins[i]]~+1~) &j>=coins[i] \\ account+1 & else \end

m[j+1]

={mi

n(m[

j−co

ins[

i]]+

1)ac

coun

t+1​

j>=c

oins

[i]e

lse​

以上公式的意思是,如果我當前要配出10 給出的硬幣是1,5,7

由於 10 大於1,5,7 ,所以我有三種選擇:

m (10

)=mi

n(m[

10−1]

+1,m

[10−5

]+1,

m[10−

7]+1

)m(10)=min(m[10-1]+1,~m[10-5]+1,~m[10-7]+1)

m(10)=

min(

m[10

−1]+

1,m[

10−5

]+1,

m[10

−7]+

1)下面講下演算法實現:

首先對於傳入 引數的進行判斷(boundary case)

如果account<0 不合法

如果coins為空 ,不合法

如果coins中的最小值都大於account ,無法配出

接下來迴圈計算記憶陣列

初始化陣列,並將m[0]=0 表示當account=0 時,不需要硬幣

根據公式 迴圈計算每乙個m的值

tips:

由於無法確定coins中的元素是否都滿足條件 coins[i]# # 零錢兌換.py

# # description : 使用不同面值的硬幣配出給定的面值.求最少硬幣個數.

defsolution

(account,coins)

:# definition: coins=[1,5,7] account = 10

#boundary case

if account <=0:

return0if

len(coins)==0

:return-1

ifmin

(coins)

>account:

return-1

#init memory sequence

m=[-1

for _ in

range

(account+1)

] m[0]

=0for j in

range(1

,account+1)

: min_c=account+

1#定義無法配出的標誌

for c in coins:

if c<=j:

min_c =m[j-c]

if m[j-c]

m[j]

=min_c +

1if min_c 1else account+

1if m[-1

]==account+1:

#表示無法配出

return-1

else

:return m[-1

]#m[-1]表示配出account所需要的最少硬幣數。

print

(solution(10,

[1,5

,7])

)

動態規劃 零錢兌換

問題描述 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。比如coins 1,2,5 amount 11,11 5 5 1,最終結果為3 演算法思路 本...

零錢兌換(動態規劃)

leetcode 322 零錢兌換 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2...

零錢兌換 動態規劃

給定不同面額的硬幣coins和乙個總金額amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 ...