当试图在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))
答案 0 :(得分:0)
要购买的糖果数量有限制,您的编码中没有包含该数量。您money=11
的价值很高,因为您已经购买了11个单位糖果。这不是因为最昂贵的糖果是10单位;这是因为您最多只能购买10件商品。
您的解决方案还需要直接或隐式跟踪每个排列中的糖果数量。该站点上提供的解决方案(您刚刚在上面发布了该解决方案)在递归深度上实现了此限制。