給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
你可以認為每種硬幣的數量是無限的。
示例 1:
輸入:coins =[1
,2,5
], amount =
11輸出:3
解釋:11=5
+5+1
此題相當於完全揹包問題,與01揹包問題的不同在於,完全揹包問題中的物品可以無限取,而01揹包問題每個問題只能取一次或者不取。通過零一揹包的狀態轉移方程可以推導出完全揹包的狀態轉移方程:
f (i
,j)=
max(
f(i−
1,j)
,f(i
,j−v
[i])
+w[i
])
f(i,j) = max(f(i-1,j), f(i, j - v[i]) +w[i])
f(i,j)
=max
(f(i
−1,j
),f(
i,j−
v[i]
)+w[
i])揹包問題需要注意題目問的是恰好放滿揹包還是,揹包可以不放滿,如果是恰好則初始化條件只能初始化f
(0...n,
0)為0
,f(0
,1...v)
為無解(
+inf
init
y或者−
infi
nity
根據題目
求最大還
是最小初
始化
)f(0...n,0)為0, f(0, 1...v)為無解(+infinity 或者-infinity根據題目求最大還是最小初始化)
f(0...
n,0)
為0,f
(0,1
...v
)為無解
(+in
fini
ty或者
−inf
init
y根據題
目求最大
還是最小
初始化)
;如果不要求揹包被剛好放滿則初始化條件為f
(0...n,
0)=0
,f(0
,1...v)
=0
f(0...n, 0) = 0,f(0, 1...v) = 0
f(0...
n,0)
=0,f
(0,1
...v
)=0
此題屬於揹包恰好放滿的情況,下面是二維dp的**
class
solution}}
return dp[n]
[amount]
== integer.max_value -1?
-1: dp[n]
[amount];}
}
可以對上面的二維dp進行空間優化改為1維dp,改進後可以發現完全揹包只需要將 0-1 揹包的逆序遍歷 dp 陣列改為正序遍歷即可。
class
solution
}return dp[amount]
== integer.max_value -1?
-1: dp[amount];}
}
leetcode322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11輸出 3解釋 11 5 5 1 示例 2 輸入 coins 2 amount 3...
leetcode 322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1示例 2 輸入 coins 2 amount ...
LeetCode 322 零錢兌換
322 零錢兌換 題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 co...