Cho các mệnh giá đồng xu và số tiền amount. Tìm số đồng xu ít nhất để đổi tiền. Nếu không thể, trả về -1.
Ví dụ: coins = [1,2,5], amount = 64 → 14 (12×5 + 2 + 2 = 64).
Quy trình giải quyết (Dynamic Programming)
- Nếu
amount == 0, trả về 0. - Nếu mệnh giá nhỏ nhất >
amount, trả về -1. - Tạo mảng
dpkích thướcamount+1khởi tạo -1. - Với mỗi mệnh giá
i:- Nếu
ivượt quá kích thướcdp, bỏ qua. dp[i] = 1.- Với
jtừi+1đếnamount:- Nếu
dp[j-i] == -1, bỏ qua. - Nếu
dp[j] == -1, gándp[j] = dp[j-i] + 1. - Ngược lại
dp[j] = min(dp[j], dp[j-i] + 1).
- Nếu
- Nếu
- Trả về
dp[amount].
Ví dụ mã nguồn
class Solution:
def coinChange(self, coins, amount):
if amount == 0:
return 0
if min(coins) > amount:
return -1
dp = [-1 for i in range(0, amount + 1)]
for i in coins:
if i > len(dp) - 1:
continue
dp[i] = 1
for j in range(i + 1, amount + 1):
if dp[j - i] == -1:
continue
elif dp[j] == -1:
dp[j] = dp[j - i] + 1
else:
dp[j] = min(dp[j], dp[j - i] + 1)
return dp[amount]
ob1 = Solution()
print(ob1.coinChange([1, 2, 5], 64)) # Output: 14
Đầu vào
[1, 2, 5], 64
Đầu ra
14