【发布时间】:2016-08-17 21:00:34
【问题描述】:
我创建了一个递归函数,它返回您可以在市场上销售苹果的最佳价格。由于在现实世界中解释这个问题要简单得多,所以我将在买家和苹果上解释它。
共有三个买家。每个买家愿意为不同的苹果支付不同的价格。
必须有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] 以某种方式获得,但这里有所有选项,不仅仅是我想要的。
【问题讨论】:
-
你能解释一下你需要什么吗?请简而言之..我不明白
-
我想知道最佳组合(哪些苹果必须卖给哪些买家)。现在,该函数返回可能的最优价格。
-
例如 apples = [[1,50,1], [1,50,1], [1,80,50]] >> 应该返回 110 吗? :S
-
不,应该是 101。因为这是您可以获得的最大值。您将第一个苹果卖给第二个买家 [0][1],第二个苹果卖给第一个买家 [1][0],第三个苹果卖给第三个买家 [2][2]。这是您可以从中获得的最畅销产品。
-
由于你必须向每个买家出售相同数量的苹果,我将第二个苹果卖给第三个买家(80 美元),你必须以 1 美元的价格再出售一个苹果你别无选择。
标签: python algorithm recursion dynamic-programming