鉴于货币价值和糖果价格,购买糖果的方式数量

时间:2019-02-13 23:14:13

标签: python dynamic-programming

当试图在brilliant.org Dynamic Programming: Level 4 Challenges上解决问题时,我尝试了一种简单的解决方案,即仅使用数组(或列表)并存储每种货币价值的支出方式。这一直有效,直到money变量大于10。到11时,它的值比应有的多1,而我无法找到原因。我想象它要对相同的值进行两次计数,但是由于此时的可能性太多,因此一一计数是不可行的。

我已经看过解决方案了,但是我只是想暗示一下这里可能缺少的内容。

编辑:可能解决方案的所有排列也应计算在内。

money = 40
values = [1, 2, 5, 10]

def solver(money, values):
    mtx = [0 for _ in range(money+1)]

    mtx[0] = 1; mtx[1] = 1

        for i in range(2, money+1):
            for v in values:
            if i - v >= 0:
                mtx[i] += mtx[i-v]

    return mtx[-1]

编辑2:此代码发布在网站的解决方案部分中,提供了正确的答案。我认为“ res = 1,如果n == 0,否则为0”行,当它执行“ else 0”时,可能是根据我的解决方案进行校正的地方,但是我不确定

Candide_ = {}

def Candide(n, depth):
    "Candice's trip to the candy shop"
    if depth == 0:
        res = 1 if n == 0 else 0
    elif n == 0:
        res  = 1
    elif (n, depth) in Candide_:
       res  =  Candide_[(n, depth)]
    else:
        res = sum(Candide(m, depth - 1) for m in [n-1, n-2, n-5, n-10] if m >= 0)
        Candide_[(n, depth)] = res
    return res

print(Candide(40, 10))

1 个答案:

答案 0 :(得分:0)

要购买的糖果数量有限制,您的编码中没有包含该数量。您money=11的价值很高,因为您已经购买了11个单位糖果。这不是因为最昂贵的糖果是10单位;这是因为您最多只能购买10件商品。

您的解决方案还需要直接或隐式跟踪每个排列中的糖果数量。该站点上提供的解决方案(您刚刚在上面发布了该解决方案)在递归深度上实现了此限制。