我已经创建了一个递归函数,它可以返回最优惠的价格,您可以在市场上销售苹果。由于在现实世界中解释这个问题要简单得多,我将在买家和苹果上解释它。
有三个买家。每个买家都愿意为不同的苹果支付不同的价格。
必须有3*n
个苹果,因为你必须向所有(三个)买家出售相同数量的苹果。
该功能找到最佳卖出价。
例如:apples = [[1,50,1], [1,50,1], [1,1,50]]
表示有三个买家和三个苹果。
第一个苹果(apples[0]
)可以1美元卖给第一买家(apples[0][0]
),50美元卖给第二买家,1美元卖给第三买家。
(函数返回101这是正确的,你不能分发那三个赚更多钱的苹果)
此功能效果很好,但会计算结果(您赚多少钱)。我想知道哪个苹果我要卖给哪个买家才能赚到最多的钱。它在某处,但我无法弄清楚如何从函数中获取它,因为它是递归的,直到递归不在最后一级,你不知道你需要计算哪些结果。
apples = [[1,50,1], [1,50,1], [1,1,50]]
def sell_apples(buyer1, buyer2, buyer3):
global results
if (buyer1,buyer2,buyer3) in results.keys():
return results[(buyer1,buyer2,buyer3)]
n = sum([buyer1, buyer2, buyer3])
if buyer1 == buyer2 == buyer3 == 0 or n == 0:
return 0
os = []
for i in range(3):
buyers = [buyer1, buyer2, buyer3]
if buyers[i] > 0:
buyers[i] -= 1
os.append(sell_apples(*buyers) + apples[n - 1][i]) # here are possible parts of results
m = max(os)
results[(buyer1,buyer2,buyer3)]=m
return m
print sell_apples(1,1,1)
返回101,这是正确的。但是我希望得到这样的结果:[(0,1),(1,0),(2,2)]
这意味着当你把第一个苹果卖给第二个买家,第二个苹果卖给第一个买家,第三个苹果卖给第三个买家时,你得到的效果最好。
它可以以某种方式从apples[n-1][i]
获得,但这里有所有选项,而不仅仅是我想要的选项。
答案 0 :(得分:0)
可能递归并不是解决此问题的最佳方法,因为如果重新计算中间结果,看起来会有很多。您已通过缓存这些结果缓解了此问题。相反,您可以尝试自下而上地构建问题,首先计算较小问题的最佳结果并将它们保存在表格中。由于您将结果保存在表格中,因此跟踪最终解决方案而不仅仅是分数也会更容易。
有趣的是,这种自下而上的保持中间结果的方法被称为“动态编程”,你在标签中提到,但是不要在你的程序中使用。动态编程算法有一些很好的例子,例如:对于背包问题或维特比算法和(对于一个非常基本的例子)计算斐波纳契数。您的问题的快速解决方法是每次从该功能返回时跟踪买家配置。