สมมติว่าเรามีเหรียญมูลค่าคงที่ [1, 5, 10, 25] และจำนวนเงิน amount หาจำนวนเหรียญน้อยที่สุดที่รวมเป็น amount
ตัวอย่าง: amount = 64 ผลลัพธ์ 7 (25+25+10+1+1+1+1=64)
ขั้นตอนการแก้ปัญหา (Dynamic Programming)
- ถ้า
amount == 0คืนค่า 0 - ถ้า
min(coins) > amountคืนค่า -1 - สร้าง
dpขนาดamount+1เติม -1 - สำหรับแต่ละ
iในcoins:- ถ้า
i > len(dp)-1: ข้าม dp[i] = 1- สำหรับ
jจากi+1ถึงamount:- ถ้า
dp[j-i] == -1: ข้าม - ถ้า
dp[j] == -1:dp[j] = dp[j-i] + 1 - อื่นๆ:
dp[j] = min(dp[j], dp[j-i] + 1)
- ถ้า
- ถ้า
- คืนค่า
dp[amount]
ตัวอย่างโค้ด Python
class Solution(object):
def coinChange(self, amount):
coins = [1, 5, 10, 25]
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(64)) # Output: 7
อินพุต / เอาต์พุต
Input: 64
Output: 7