零钱兑换问题

def coinChange(coins, amount): # 给你的零钱面额(不限数量)       要凑的总面额
    
    # 异常判断特殊情况(完全不可能有解的情况!)
    if amount == 0:
        return 0
    if len(coins) == 0:
        return -1
    if len(coins) ==1 and  coins[0] > amount:
        return -1
    
    # 建立存储空间并初始化, 有的位置可能得不到
    mem = [-1 for i in range(amount + 1)]
    mem[0] = 0
    
    for i in range(1, amount + 1):
        cur_min = amount + 1
        for c in coins:
            
            # 当钱币面值 < 当前需要凑的金额时
            if c <= i:
                
                # 动态转移方程(找减少c元需要的最少零钱个数量,c为存在的零钱面额)
                cur_min = mem[i - c] if mem[i - c] < cur_min else cur_min
        
        # 不断更新为i元时,需要的最少零钱个数
        mem[i] = cur_min + 1 if cur_min < amount + 1 else amount + 1
        
    # 找不到这一方案!        
    if mem[-1] == amount + 1:
        return -1
    else:
        return mem[-1]

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐