题目描述:
某仓库有一排货箱,按从左致右的顺序把每个货箱的重量记录在数组boxes中,工人们需要搬运所有货箱,要求如下:1.货箱堆从左到右分成三堆,每一堆至少有1个货箱2.三堆重量左<=中<=右,问有几种可行的方法?
思路:
1、这个题就是压缩数组,不能改变原来的相对顺序,相邻元素相加合并为一个。
2、使得最后数组元素个数压缩为3个,也就是3堆。
代码演示:
nums=list(map(int,input().strip().split()))
piles=[0 for i in range(3)] #表示三个堆
sum_weight=sum(nums) #总重量
first_limit=sum_weight//3+1 #第一堆不能超过总重的1/3
second_limit=(sum_weight//3+1)*2#前两堆重量和,不能超过总重的2/3
res=0
def dfs(index,pile_id):
global res,nums,first_limit,second_limit
if pile_id==2:
#这里要注意pile_id最大是2,到了最后一堆,把index后面所有元素全加到piles[2],然后返回
piles[pile_id]+=sum(nums[index:])
if 0<piles[0]<=piles[1]<=piles[2]:#堆不能为空,至少要有一个
print('+1',piles)
res+=1
return
for i in range(index,len(nums)-(2-pile_id)):
#每个堆只少要有一个元素,所以与pile_id有关
#第一个堆,至少剩下最右边2个元素,给后两个堆
#第二个堆,至少剩下最右边1个元素,给后一个堆
piles[pile_id]+=nums[i]#这里是i,不是index
if piles[0] >= first_limit:
break
if piles[0] + piles[1] >= second_limit:
break
dfs(i+1,pile_id+1) #这里是i+1,不是index+1,不要写错了
piles[pile_id+1]=0 #回溯,每次递归后,右边的堆,即下一个堆,必须清0
dfs(0,0)
print(res)
测试用例:
#用例1
1 1 2 1 4
res: 5
#用例2
3 2 3
res:0