找零算法

找零钱的算法

1. 很慢的递归解决方案

# 递归版本
def recMC(coinValueList, change):
    minCoins = change
    if change in coinValueList:
        return 1
    else:
        for i in [c for c in coinValueList if c < change]:
            numCoins = 1 + recMC(coinValueList, change-i)
            if numCoins < minCoins:
                minCoins = numCoins
    return minCoins


print(recMC([1,5,10,25], 63))

2. 添加了查询表的找零算法

def recDC(coinValueList, change, knownResults):
    start = time.time()
    minCoins = change
    if change in coinValueList:
        knownResults[change] = 1
        return 1
    elif knownResults[change] > 0:
        return knownResults[change]
    else:
        for i in [c for c in coinValueList if c < change]:
            numCoins = 1 + recDC(coinValueList, change-i, knownResults)
            if numCoins < minCoins:
                minCoins = numCoins
                knownResults[change] = minCoins
    end = time.time()
    length = end - start
    print(length)

    return minCoins

3.动态规划版本的找零算法

# 动态规划版本找零问题
def dpMakeChange(coinValueList, change, minCoins, coinUsed):
    for cents in range(change+1):
        coinCount = cents
        new_coin = 1
        for j in [c for c in coinValueList if c <= cents]:
            if minCoins[cents-j] + 1 < coinCount:
                coinCount = minCoins[cents-j] + 1
                new_coin = j
        minCoins[cents] = coinCount
        coinUsed[cents] = new_coin
    return minCoins[change]


def printCoins(coinsUsed, change):
    coin = change
    while coin > 0:
        thisCoin = coinsUsed[coin]
        print(thisCoin)
        coin = coin - thisCoin

c1 = [1,5,10,21,25]
coinUsed = [0]*64
coinCount = [0]*64

cnt = dpMakeChange(c1, 63, coinCount, coinUsed)
print(cnt)

printCoins(coinUsed, 63)
printCoins(coinUsed, 52)

output:
3
21
21
21
10
21
21

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 4,280评论 0 3
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,888评论 0 9
  • 第二段讲的是一个从小就被规划好,继承家里百年鱼店的青年,却怀揣音乐家的梦想,并且为了实现这个梦想,放弃读大学,只因...
    桅笑阅读 1,324评论 0 0
  • 老师为了让我们爱上阅读,老师就在班里面建立了一个图书角。一两天的时间,我们班的图书角就建立起来了,有的同学...
    胭脂_13ae阅读 3,021评论 0 0
  • 我理想中的朋友圈是这样子的:有很多拥有活力的朋友,大家有创意,有情绪,情商高,过的有趣,那种无需金钱堆积起来的趣味...
    Ernestyoung阅读 1,751评论 0 0

友情链接更多精彩内容