Packets

一家工厂生产的产品规格分为1×1, 2×2, 3×3, 4×4, 5×5, 6×6,高都是h。工厂要把它们包在6×6×h的包装袋中。工厂想让包装数尽可能少。
Input
多组数据。每一行为一组数据。依次是1×1, 2×2, 3×3, 4×4, 5×5, 6×6的产品的个数。 输入数据由6个0结束。
Output
对于每组数据,输出包装所有产品所需最少包装袋数量
Sample Input
0 0 4 0 0 1
7 5 1 0 0 0
0 0 1 0 1 0
0 0 0 0 0 0
Sample Output
2
1
2
思路:
先从大向小开始包装,因为大的包装剩了空间还可以包装小的;
1个包装袋装一个66包装正好
1个包装袋装一个 5
5的包装后,还可以包装11个11的产品;
1个包装袋装一个 4
4的包装后,还可以包装5个22的产品,22不够包装11;
1个包装袋装 3
3的产品,情况如下:
4个33产品,正好
3个3
3产品,还可包装1个22的产品,剩余包装和22不够包装11;
2个3
3产品,还可包装3个22的产品,剩余包装和22不够包装11;`
1个3
3产品,还可包装5个22的产品,剩余包装和22不够包装1*1;

#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int arr[6];
int main()
{
   int i,s,minn;
   while(scanf("%d",&arr[0])!=EOF){
        int flag=0,rest=0;
        if(arr[0]!=0)
            flag=1;
         s=0;
        for(i=1;i<6;i++){
              scanf("%d",&arr[i]);
                 if(arr[i]!=0)
            flag=1;
        }
        if(flag==0)
            break;
             s=s+arr[5];//装满6*6最多装1个
             s=s+arr[4];
             //一个5*5最多放1*1的11个
             if(arr[0]<=arr[4]*11)
             arr[0]=0;
             else
                 arr[0]-=arr[4]*11;
             s+=arr[3];
              //一个4*4最多放2*2的5个
             if(arr[3]!=0){
                if(arr[1]<=arr[3]*5){
                rest=arr[3]*(36-16);
                 rest-=arr[1]*4;
                     arr[1]=0;
                    if(rest!=0)
                        arr[0]-=rest;
                  }
             else
                 arr[1]-=arr[3]*5;
             }
               //四个3*3正好放满
             minn=arr[2]%4==0?arr[2]/4:arr[2]/4+1;
             s+=minn;
            if(arr[2]%4!=0){
              //三个3*3最多放2*2的1个
                  if(arr[2]%4==3){
                       if(arr[1]>0){
                          arr[1]-=1;
                         arr[0]-=min(5,arr[0]);
                         }
                      else
                           arr[0]-=min(9,arr[0]);
                       }
                         //两个3*3最多放2*2的3个
                      else if(arr[2]%4==2){
                       rest=18;
                       if(arr[1]>0){
                         rest-=min(arr[1],3)*4;
                        arr[1]-=min(arr[1],3);
                       }
                        if(rest>0)
                            arr[0]-=min(rest,arr[0]);
                        }
                         //一个3*3最多放2*2的5个
                    else {
                       if(arr[1]>0){
                             rest=27;
                             if(arr[1]>0){
                                rest-=min(arr[1],5)*4;
                               arr[1]-=min(arr[1],5);
                             }
                             if(rest>0)
                                arr[0]-=min(rest,arr[0]);
                       }
                      }

                }
              if(arr[1]>0)
              {
                  minn=arr[1]%9==0?arr[1]/9:arr[1]/9+1;//装满2*2最多装9个
                s+=minn;
                if(arr[1]%9!=0){
                    rest=36-arr[1]%9*4;
                    arr[0]-=min(rest,arr[0]);
                }
            }
            if(arr[0]>0)
            {
                minn=arr[0]%36==0?arr[0]/36:arr[0]/36+1;//装满1*1最多装36个
                s+=minn;
            }
         printf("%d\n",s);
      }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值