今天大俠要討論的題目是:【零錢兌換問題】
這是一道經典的動態規劃問題. 此題目中,你將會看到動態規劃全域性最優解的體現。以及常見動態規劃解題思路總結。
零錢兌換給定不同面額的硬幣 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所需要的最少硬幣數。
(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 輸入 ...