POJ-1017-Packets-箱子填装

本题大意:一个工厂所造产品形状都是底为正方形,高为H的矩形状!

有6个型号:1*1,2*2,3*3,4*4,5*5,6*6.........

这个工厂每次都是使用6*6*H的箱子将产品包装好然后快递给顾客的!由于邮费的原因,工厂想要将多个产品放一起节约空间,从而达到减少箱子使用的个数!


这个题的想法嘛:其实不用对产品体积有过多的想法,因为产品和箱子的高度均为H,所以只需要考虑底面积的最大利用率即可,尽可能的不浪费箱子空间!

1.1个箱子相当于型号为36个1*1的产品,相当于9个型号为2*2的产品!

2.型号为2*2和1*1的产品,先不着急用于填装,基于贪心算法,将这两种型号的产品放在最后使用,用来尽可能的弥补剩余的空间,尽可能的弥补完后若有剩余,再依据第1点所说,进行单独填补!

3.1个型号为6*6的产品刚好可以填满1个箱子;1个型号为5*5的产品可以和型号为1*1的产品搭配;1个型号为4*4的可以和型号为2*2的或者1*1的产品搭配;

4.一个箱子仅且只能放一个型号为6*6或者5*5或者4*4的产品,剩余的空间即可用2*2和1*1的产品填补!

5.1个箱子放4个型号为3*3的产品刚好放满,所以1个箱子如果不足4个3*3的产品的话,就如上所述操作了!


代码如下:


#include<stdio.h>
#include<string.h>
int main()
{
    int h[7],p2[4]={0,5,3,1};//表示与i个3*3的产品相搭配所需要
    //所需要的2*2的产品的个数!
    while(1)
    {
        int flag=0;
        for(int i=1;i<=6;i++)
        {
            scanf("%d",&h[i]);
            if(h[i]!=0)
                flag=1;
        }
        if(flag==0)
        break;
        int ans=h[6]+h[5]+h[4]+h[3]/4;//因为四个3*3能完整填一个,所以使用整除操作!
        if(h[3]%4!=0)
        ans++;//表示还有剩余的3*3的产品!
        int num2=h[4]*5+p2[h[3]%4];//一个箱子除去一个4*4,还剩下5个2*2!
        if(num2<h[2])
        {
            ans+=(h[2]-num2)/9;//9个2*2就可以占用一个箱子!
            if((h[2]-num2)%9!=0)
            ans++;//还有剩,那么就必须再占用一个箱子了!
        }
        int num1=ans*36-h[6]*36-h[5]*25-h[4]*16-h[3]*9-h[2]*4;//“1个产品对等于另外n个产品”问题!当前一个箱子就相当于36个1*1  ,
        //一个5*5的产品就相当于25个1*1  !
        if(num1<h[1])
        {
            ans+=(h[1]-num1)/36;//36个1*1就可以占用一个箱子!
            if((h[1]-num1)%36!=0)
            ans++;//还有剩,那么就必须再占用一个箱子了!
        }
        printf("%d\n",ans);
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值