我已经创建了一个功能,我虽然这是一个动态编程方法,但我发现DP
可以是自下而上但是这个功能是自上而下。现在,我尝试将此功能转换为Bottom-Up
。你们有任何提示吗?
有3*n
个苹果(3,6,9 ..或81 ..)和3个买家。每个买家都能以不同的价格购买每个苹果。输入是价格的列表(苹果)。 [[1,2],[4,5]]
意味着第一个苹果可以1美元的价格卖给第一个买家,2美元卖给第二个买家。
该功能会返回您可以获得的最佳价格。
我唯一想要的是将它从Top-Down
转换为Bottom-up
,这样我就可以使用动态编程,但我没有成功。
apples = [[1,50,1], [1,50,1], [1,80,50]] (3 apples for example)
results = {}
def sell_apples(buyer1, buyer2, buyer3):
global results
if (buyer1,buyer2,buyer3) in results.keys(): # memoization
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])
m = max(os)
results[(buyer1,buyer2,buyer3)]=m # memoization
return m
DP Bottom-Up方法:(这是我得到的)
def sell_apples_bottom_up(buyer1,buyer2,buyer3):
n = sum([buyer1, buyer2, buyer3])
def sabu(buyer1,buyer2,buyer3):
if all(x==0 for x in [buyer1,buyer2,buyer3]):
return 0
os = []
for i in range(3):
buyers = [buyer1,buyer2,buyer3]
if buyers[i]>0:
buyers[i] -= 1
os.append(sabu(*buyers))
m = max(os)
return m
# LOST HERE