当前位置: 首页 > 面试题库 >

记住硬币找零

司马狐若
2023-03-14
问题内容

为此,我想将硬币兑换功能转换为记忆功能
,因此我决定使用字典,以便字典中的键将是硬币,而值将是包含所有可更改“钥匙”的硬币的列表。硬币。
我所做的是:

def change(a,kinds=(50,20,10,5,1)):
    if(a==0):
            return 1
    if(a<0 or len(kinds)==0):
            return 0

    return change(a-kinds[0],kinds)+change(a,kinds[1:])


def memoizeChange(f):
    cache={}
    def memo(a,kinds=(50,20,10,5,1)):

        if len(cache)>0 and kinds in cache[a]:
            return 1
        else:
            if(f(a,kinds)==1):
                cache[a]=kinds // or maybe cache[a].append(..)
                return cache[a]+memo(a-kinds[0],kinds)+memo(a,kinds[1:])
    return memo

memC=memoizeChange(change)
kinds=(50,20,10,5,1)
print(memC(10,kinds))

我想得到一些建议,或者也许有另一种方法可以做到这一点。
谢谢。

编辑
备注版本:

def change(a,kinds=(50,20,10,5,1)):
    if(a==0):
            return 1
    if(a<0 or len(kinds)==0):
            return 0
    return change(a-kinds[0],kinds)+change(a,kinds[1:])


def memoizeChange(f):
    cache={}
    def memo(a,kinds=(50,20,10,5,1)):
        if not (a,kinds) in cache:
                cache[(a,kinds)]=f(a,kinds)
        return cache[(a,kinds)]
    return memo

change=memoizeChange(change)
print(change(10))

问题答案:

当您可以只使用通用的预先编写的装饰器时,不必编写专门的记忆装饰器。例如,直接来自
PythonDecoratorLibrary

的以下 代码

import collections
import functools

class memoized(object):
   '''Decorator. Caches a function's return value each time it is called.
   If called later with the same arguments, the cached value is returned
   (not reevaluated).
   '''
   def __init__(self, func):
      self.func = func
      self.cache = {}
   def __call__(self, *args):
      if not isinstance(args, collections.Hashable):
         # uncacheable. a list, for instance.
         # better to not cache than blow up.
         return self.func(*args)
      if args in self.cache:
         return self.cache[args]
      else:
         value = self.func(*args)
         self.cache[args] = value
         return value
   def __repr__(self):
      '''Return the function's docstring.'''
      return self.func.__doc__
   def __get__(self, obj, objtype):
      '''Support instance methods.'''
      return functools.partial(self.__call__, obj)

然后可以将其应用于change()函数(或其他函数,因为它是通用的),如下所示:

@memoized
def change(a, kinds=(50, 20, 10, 5, 1)):
    if a == 0:
        return 1
    if a < 0 or len(kinds) == 0:
        return 0

    return change(a - kinds[0], kinds) + change(a, kinds[1:])

print(change(10))  # 4


 类似资料:
  • 只是在这里遇到了这个简单的算法,从相同的称重硬币列表中找到奇数硬币(重达重)。 我可以理解,如果我们一次拿3个硬币,那么最小称重次数只有两个。 我是怎么找到答案的? 我人工试了一下一次称4套硬币,一次称3套硬币,一次称两个硬币,一次称一个硬币。 当然,只有当我们一次拿3个硬币时,最少的步数(两步)才是可以达到的。 问题是,你怎么知道我们必须拿3个硬币? 我只是想知道如何解决这个难题,而不是做所有可

  • 我正试图解决一个经典的动态规划硬币兑换问题。这是一个家庭作业问题,我不是在寻找完整的解决方案,只是想找几个指针看看我做错了什么。 输入: 金额我们想用硬币支付一些价值 集合表示面值(1c、5c、10c、25c、100c、200c)的可用硬币数量 输出: 需要换手支付的最低硬币数。 假设: 收银机操作员有无限的硬币供应,知道如何给最佳的变化。 到目前为止,我试图做的是: 我试图建立一个数组C,使得每

  • 动态规划变更问题(有限硬币)。我正在尝试创建一个以以下内容作为输入的程序: 输出: 输出应该是大小为1的数组,其中每个单元格代表我们需要改变单元格索引量的最佳硬币数。 假设数组的单元格位于index: 5,内容为2。这意味着为了给出5(INDEX)的变化,您需要2(单元格的内容)硬币(最佳解决方案)。 基本上,我需要这个视频的第一个数组的输出(C[p])。这与有限硬币的大区别是完全相同的问题。链接

  • 所以我对编码不熟悉,我得到了一个任务,我需要做一个程序,用四分之一、一角、五分和一美分给不到一美元的零钱。然而,作业希望程序打印所需的最低硬币数量(例如,如果我输入58美分,那么输出应该是“2个25美分,1个镍和3个便士”,而不是“2个25美分,0个10美分,1个镍和3个便士”。本质上,如果没有某种硬币,那么程序就不应该打印它)。我一直在想如何制作它,这样程序就不会打印任何不必要的硬币。 这就是我

  • 我正在解决这个问题-COLCOIN-在spoj上收集硬币。链接-https://www.spoj.com/problems/COLCOIN/ 对于给定的一组面额和你想要的货币,银行会给你最高面额的硬币,直到它不能再给你了,然后转移到下一个最高面额。例如:如果面额为[1,2,3,4,8],如果您要求23卢比,它会先给您两个8卢比的硬币,因为它不能再给任何8卢比的硬币,所以会移动到下一个面额,给您一个

  • 问题:https://leetcode.com/problems/coin-change/ 解决方案:https://repl.it/@Stylebender/HatefulAliceBlueTransverse#index.js 我理解从“按钮式”构建dp阵列解决方案的一般概念流程,但我只是想知道关于第10行: dp[i]=数学。最小值(dp[i],1 dp[i-硬币[j]]; 当你选择当前的第