Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ปัญหา Coin Change ใน Python


สมมติว่าเรามีเหรียญมูลค่าต่างกันและจำนวนเงินรวม amount เราต้องกำหนดฟังก์ชันหนึ่งเพื่อคำนวณจำนวนเหรียญน้อยที่สุดที่จำเป็นเพื่อรวมเป็นจำนวนเงินดังกล่าว หากจำนวนเงินนั้นไม่สามารถทำได้จากการรวมเหรียญใดๆ ให้คืนค่า -1 ตัวอย่างเช่น หากอินพุตคือ [1,2,5] และ amount คือ 11 ผลลัพธ์คือ 3 ซึ่งมาจาก 5 + 5 + 1 = 11

ขั้นตอนการแก้ปัญหา

  • ถ้า amount = 0 ให้คืนค่า 0
  • ถ้าค่าต่ำสุดของอาร์เรย์เหรียญ > amount ให้คืนค่า -1
  • กำหนดอาร์เรย์ชื่อ dp ขนาด amount + 1 และเติมด้วย -1
  • for i ในช่วงอาร์เรย์เหรียญ
    • ถ้า i > ความยาวของ dp - 1 ให้ข้ามไปยังรอบถัดไป
    • dp[i] := 1
    • for j ในช่วง i + 1 ถึง amount
      • ถ้า dp[j - 1] = -1 ให้ข้ามไปยังรอบถัดไป
      • อื่นๆ ถ้า dp[j] = -1 ให้ dp[j] := dp[j - i] + 1
      • อื่นๆ dp[j] := ค่าต่ำสุดของ dp[j] และ dp[j - i] + 1
  • คืนค่า dp[amount]

ตัวอย่าง (Python):

ลองดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น

class Solution(object): 
    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], 11))

อินพุต

[1,2,5] 11

เอาต์พุต

3