箱子问题【超级详细解析】

Description:

一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有6个型号,它们的长宽分别为1×1,2×2,3×3,4×4,5×5,6×6。这些产品通常使用一个6×6×h的长方体包裹包装,然后邮寄给客户。因为邮费很贵,所以工厂要想方设法地减少每个订单运送时的包裹数量。他们很需要有一个好的程序以解决这个问题从而节省费用。现在这个程序由你来设计。

Input:

每个订单信息用包括6个整数的一行数据表示,中间用空格隔开,分别为1×1至6×6这6种产品的数量。

Output:

输出一个整数代表对应的订单所需的最小包裹数。

Sample Input:

0 0 4 0 0 1

Sample Output:

2

思路:

首先有个箱子装载图如下:

 0  0  0  0  0  0 
 0  0  0  0  0  0 
 0  0  0  0  0  0 
 0  0  0  0  0  0 
 0  0  0  0  0  0 
 0  0  0  0  0  0 
  1. 从大到小装入产品,尺寸4~6的各占一个箱子。
  2. 尺寸3要看具体情况,一个箱子最多4个尺寸3。
  3. 若尺寸3个数为n,则n/4表示被尺寸3完全转入的箱子,即箱子里面只有尺寸3。
  4. 若n%4>0则说明还有尺寸3剩余,需要再拿一个箱子装;则尺寸3一共需要(n+3)/4个箱子装,这个式子表示向上取整
  5. 若n%4=1,则新箱子只有一个尺寸3,剩余空间能装5个尺寸2(见箱子装载图);同理n%4=2,剩余空间能装2个尺寸2;n%4=3,剩余空间能装1个尺寸2。
  6. 装入尺寸3完成后,计算所有箱子里还能装入多少尺寸2。
  7. 此时开始装尺寸2,如果尺寸2的数目大于尺寸2的空位,则需要为尺寸2开拓新的箱子。
  8. 转入尺寸2完成后,计算所有箱子里还能装入多少尺寸1。
  9. 此时开始装尺寸1,如果尺寸2的数目大于尺寸1的空位,则需要为尺寸1开拓新的箱子。
  10. 最终输出箱子个数。

代码:

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int main(){
    int a[7]={0},sum=0;     //尺寸1~6分别对应数组a[1]~a[6]
    int two_size[4]={0,5,2,1};       //尺寸为3的产品,在不同情况下能装下的尺寸为2的个数
    int two_empty,one_empty;        //尺寸2和尺寸1的空位数目
    for(int i=1;i<=6;i++)
        cin>>a[i];
    sum=a[6]+a[5]+a[4]+(a[3]+3)/4;      //从大到小装,尺寸4~6的各占一个箱子,尺寸3要看具体情况
    two_empty=a[4]*5+two_size[a[3]%4];      //尺寸4箱子剩余可装5个尺寸2,尺寸3剩余空位能装多少尺寸2要看具体情况
    if(a[2]>two_empty)      //当前尺寸2的产品大于剩余可装的空位,要装入新箱子
        sum+=(a[2]-two_empty+8)/9;      //一个新箱子最多装入9个尺寸2的产品
    one_empty=sum*36-a[6]*36-a[5]*25-a[4]*16-a[3]*9-a[2]*2;     //当前能装尺寸1的剩余空间
    if(a[1]>one_empty)    //对于尺寸1的产品,同理上面的if
        sum+=(a[1]-one_empty+35)/36;
    cout<<sum<<endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值