最少找零问题

来源:互联网 发布:linux获取电池电量 编辑:程序博客网 时间:2024/06/16 01:53

假设硬币金额为1,3,9,10,14等,找零19,如果正常找零用贪心算法,我们需要14,3,1,1,4个硬币,但是其实最优解为10,9两个硬币。
所以问题可以考虑成:min(coin(n-i)+1),其中n为需要找的总额,i为各个硬币的面值,i必须小于等于n采取计算,coin(n)代表总额为n最少要找的硬币数,当n-i等于0是,需要找0个硬币。

from functools import wrapsdef memory(func):    l = {}    @wraps(func)    def wrap(n):        if n not in l:            l[n] = func(n)        return l[n]    return wrap@memorydef coin(n):    c = [1,3,9,10,14]    if n==0:        return 0    return min([coin(n-i)+1 for i in c if i<=n])