我正在研究饼干怪物问题:
饼干怪物有一张桌子,上面有一堆饼干,每堆都是一个正整数。饼干怪物必须以尽可能短的动作顺序吃掉这些饼干。每次移动都由饼干怪物选择一个整数组成,该整数必须是剩余堆大小之一。所选择的移动会从至少包含饼干的每一堆中移除饼干,并将所有较小的一堆保留为移动之前的状态。
此函数应计算并返回允许 Cookie Monster 吃掉这些饼干的最小移动次数。
桩 预期结果 (最佳动作) [1,2,3,4,5,6] 3 [4,2,1] [2、3、5、8、13、21、34、55、89] 5 [55,21,8,3,2] [1、10、17、34、43、46] 5 [34,9,8,3,1] [11、26、37、44、49、52、68、75、87、102] 6 [37、31、15、12、7、4] [2**n for n in range (10)]10 [512、256、128、64、32、16、8、4、2、1]
我得到这个提示:
对于给定的桩,您的函数应该循环遍历其可能的移动,并递归地解决将每个移动应用于桩所产生的新桩的问题。那么,桩的最佳解决方案就是这些子问题解决方案中的最佳解决方案加一。
我的想法是从列表的末尾开始,按降序向下移动。
到目前为止,这是我的代码:
piles=[11, 26, 37, 44, 49, 52, 68, 75,87, 102]
p=piles
n=len(piles)
moves=0
while sum(piles)>0:
for i in range(len(piles)-1,0,-1):
if piles[i-1]<piles[i]:
piles[i]=piles[i]-piles[i-1]
if piles[i] in p:
piles.remove(piles[i])
moves+=1
Run Code Online (Sandbox Code Playgroud)