一家工厂生产的产品规格分为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个包装袋装一个 55的包装后,还可以包装11个11的产品;
1个包装袋装一个 44的包装后,还可以包装5个22的产品,22不够包装11;
1个包装袋装 33的产品,情况如下:
4个33产品,正好
3个33产品,还可包装1个22的产品,剩余包装和22不够包装11;
2个33产品,还可包装3个22的产品,剩余包装和22不够包装11;`
1个33产品,还可包装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);
}
}