本题大意:一个工厂所造产品形状都是底为正方形,高为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;
}