打包装箱 题解

1.题目

原题链接(CQBZOJ)

题目描述

学校组织了爱心捐书活动,同学们纷纷踊跃把自己看过的旧书拿出来捐给贫困山区的孩子们。图书室的马老师把同学们捐献的书打包在了6种纸箱子里(打包好的各类纸箱子有若干个),纸箱子的高相同,但底面积分为1×1,2×2,3×3,4×4,5×5,6×6。现为了装车方便,需要把这些纸箱子装在若干个6×6的木箱子,木箱子的高和打包纸箱子相同,请你帮助马老师,用最少的木箱子打包完所有的纸箱子。

输入

一行(六个数)用空格隔开,分别表示1×1,2×2,3×3,4×4,5×5,6×6六类纸箱子的个数(每类箱子的个数小于等于100)

输出

一行,最少的木箱子个数

样例输入

6 5 4 3 2 1

样例输出

7

是的,为了我们“亲爱”的mjl,我把题目改了((


2.算法分析

用最少的木箱子装完,也就是说让剩余的空间最小,最好的情况就是除了最后一个箱子,其他箱子都装满,所以只需要考虑箱子内部的情况。故这道题可以用贪心算法解决。


3.思路

要解决箱子内部如何装满的问题,我们首先需要根据题目条件建立模型。题目告诉我们有六种不同的纸箱子和木箱子的大小,根据这些条件我们可以列出箱子内部装满时的模型如下(PS:最上面的那个数字指的是最大的那个纸箱子):

自己画的图,不要管我的猛男色彩搭配【笑哭】

可以看出,在纸箱子的大小为3×3时,情况比较多比较复杂,所以需要着重考虑。

需要注意的是,在装箱的时候我们会优先把所有3×3的纸箱子装到一个木箱子里(即4个3×3的箱子装在一个木箱子里),所以剩下的那三种情况只需要判断一次。(我就是在这个地方栽的)

这里再补充两个编程的技巧(不想看请跳过):


(1)向上取整

如果一个人问大家怎么向上取整的话,估计大多数人的回答应该都是用头文件里的 c e i l ceil ceil 函数。但是这多少有点麻烦,如果你懒得写为了方便,其实根本不需要什么函数,用整数除法就可以实现。
在c++中,整数的除法是默认为向下取整。我们假设 n n n 可以被 k k k 整除且 n / k = q n/k=q n/k=q,那么:

( n + 1 ) / k = = q (n+1)/k==q (n+1)/k=

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值