搬运货箱的方案

题目描述:

某仓库有一排货箱,按从左致右的顺序把每个货箱的重量记录在数组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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值