【发布时间】:2022-01-14 03:40:52
【问题描述】:
对于算法作业,我被要求给出一个背包问题的解决方案。我输入了一个产品列表。一种产品被分配了一个成本和一些卡路里。所以我有两套,一套钱,一套大卡。我的目标是选择能提供等量金钱和千卡的产品。
例如,如果我有这个输入:(1, 3), (2, 4), (5, 8), (4, 5)
货币总和等于 m=7 和 kcal 总和等于 k=12,我需要选择完全满足这两个总和的产品。在我的示例中,我将选择产品 (2, 4) 和 (5, 8)。我的解决方案只需要在存在符合要求的产品时返回true,否则返回false。无需退货一套产品
我已经编写了一个基于子集问题的递归解决方案,我记得我的函数是否使用最后一个产品。此解决方案有效,但速度太慢 -> 2^n。
def isSubsetSum(set, n, sum, set2, sum2):
if (sum == 0 and sum2==0):
return True
if (n == 0 or (sum < 0 or sum2 < 0)):
return False
if (set[n] > sum) or (set2[n] > sum2): # if one of the two values (money, calories) is bigger than the sum
return isSubsetSum(set, n-1, sum, set2, sum2) # we avoid using this product -> recall with n-1
inclusion = isSubsetSum(set, n-1, sum-set[n], set2, sum2-set2[n]) # we recurse includig the last product
exclusion = isSubsetSum(set, n-1, sum, set2, sum2) # we recurse excluding the last product
return inclusion or exclusion
我试图将我的子集函数更改为动态编程方法,但我很难将我的函数更改为使用两组(一组钱和一组卡路里)。
我与助教交谈,他们指导我选择背包问题而不是子集和问题。我看到了背包动态编程方法的原理,但是在将问题更改为使用我的输入时,我遇到了与之前使用子集相同的问题。
我想我遗漏了一些东西,如果你能帮助我理解我错在哪里,那就太好了。
谢谢
【问题讨论】:
标签: python dynamic-programming