递归(下)MOOC学习笔记【数据结构与算法】

本文是关于递归的下篇,重点讨论了找零问题,包括贪心策略及其失效情况,提出了高效递归解决方案。同时,介绍了用动态规划解决找零问题的两种方法,以及如何应用动态规划和递归解决博物馆大盗、铺瓷砖、发糖果等经典问题。还探讨了表达式求值的不同顺序和复杂度较高的解法。
摘要由CSDN通过智能技术生成

Recursion(下)

一、找零问题

1. 贪心策略找零(依赖于硬币体系)

def change(num):
    lst = [25,10,5,1]
    dic = {
   25:0, 10:0, 5:0, 1:0}
    pos = 0
    while num >= lst[pos]:
        dic[lst[pos]] += 1 #硬币数量加一
        num -= lst[pos]    #找零金额更新
        while num < lst[pos] and num != 0: 
            pos += 1
    return dic

change(63)   

2. 低效递归找零(贪心策略失效)

def change(coinlst,value):
    mincoins = value
    if value in coinlst:
        return 1
    else:
        for i in [each for each in coinlst if each<=value]:
            numcoins = 1 + change(coinlst,value-i)
            if numcoins < mincoins:
                mincoins = numcoins
    return mincoins
print(change([25,10,5,1],63)) #需要很久才能得到这个结果--6

3. 高效递归找零(贪心策略失效)

def change(coinlst,value,dic = {
   }):
    mincoins = value
    if value in coinlst:
        return 1
    elif value in dic:
        return dic[value]           #若记录的金额重复出现,则不再递归,而是直接返回值
    else:
        for i in [each for each in coinlst if each<=value]:
            numcoins = 1 + change(coinlst,value-i)            
            if numcoins < mincoins:
                mincoins = numcoins
            dic[value] = mincoins    #记录找零最小硬币数
    return mincoins
print(change([25,10,5,1],63))

4. 动态规划找零(得到找零硬币数目)

def change(coinlst,value,mincoins):
    for i in range(1,value+1):
        #初始化一个最大值
        mincoins[i] = i
        for j in [each for each in coinlst if each <= i]:
            numcoins = 1 + mincoins[i-j]
            if numcoins < mincoins[i]:   
                mincoins[i] = numcoins
    return mincoins[value]
print(change([1,5,10,21,25],63,[0]*64))

5. 动态规划找零(得到各面值硬币个数)

def change(coinlst,value,mincoins,newcoin):
    for i in 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值