【发布时间】:2021-04-04 17:22:46
【问题描述】:
我正在尝试学习一些动态编程的基本知识,但我遇到了以下问题:
给定一个整数 sum 和一个正整数列表 numbers,返回由属于 numbers 且总和为 sum 的最小数量组成的列表。
希望这很清楚,我给你举三个例子:
如果sum = 10 和numbers = (2, 3, 5) 应该返回[5, 5];
如果sum = 0 和numbers = (2, 3, 5) 应该返回[];
如果sum = 10 和numbers = (3) 应该返回False。
def bestsum(sum, numbers, memo={}):
if sum == 0:
return []
elif sum < 0:
return False
else:
if sum not in memo:
shortest_combination = False
for number in numbers:
remainder = sum - number
combination = bestsum(remainder, numbers)
if combination != False:
combination.append(number)
if shortest_combination == False or len(combination) < len(shortest_combination):
shortest_combination = combination
memo[sum] = shortest_combination
return memo[sum]
我没有将memo 作为我对bestsum 的递归调用的输入,因为它与我之前做过的其他动态程序一起使用。但是,即使我添加它,脚本也不起作用,即使我没有明确地这样做,它也会更新memo。添加copy.copy 或实际插入我的memo 作为输入无济于事。也许问题在于,当我调用不同的函数以及可能递归地调用其他函数时,我仍然想念变量在我的记忆中是如何生活的。
【问题讨论】:
-
两个快速点。首先,不知道变量关键字。这意味着您应该重命名 sum 变量。其次,该函数似乎要么返回一个列表,要么返回一个布尔值。我会收紧的。
-
@bdempeL “不知道变量关键字”?
标签: python dynamic-programming