一、题意:有底面积为1*1,2*2,...,6*6高为h的物品若干,求用最少的包装盒包装好这些物品,其中包装盒的大小固定为底面积6*6,高为h
二、思路:贪心。先放大的,然后用小的尽量去凑满这个包装盒,从6到1类推。我用的是比较暴力的方法,每一种情况都考虑出来,然后模拟。
三、代码:
#include"iostream"
#include"stdio.h"
#include"math.h"
using namespace std;
int num[7];
int Solve()
{
int res=num[5];
res+=num[4];
num[0]-=num[4]*11;
res+=num[3];
if(num[1]<num[3]*5)
{
num[0]-=(20*num[3]-4*num[1]);
}
num[1]-=num[3]*5;
res+=num[2]/4;
int numLeave=num[2]%4;
if(numLeave>0) res++;
switch(numLeave)
{
case 1:
if(num[1]<5)
{
if(num[1]>0)
{
num[0]-=(27-num[1]*4);
num[1]=0;
}
else
num[0]-=27;
}
else
{
num[1]-=5;
num[0]-=7;
}
break;
case 2:
if(num[1]<3)
{
if(num[1]>0)
{
num[1]=0;
num[0]-=(18-num[1]*4);
}
else
num[0]-=18;
}
else
{
num[1]-=3;
num[0]-=6;
}
break;
case 3:
if(num[1]<1)
{
num[0]-=9;
}
else
{
num[1]-=1;
num[0]-=5;
}
break;
default:
break;
}
if(num[1]>0)
{
res+=num[1]/9;
if(num[1]%9>0)
{
res++;
num[0]-=(36-4*(num[1]%9));
}
}
if(num[0]>0)
{
res+=ceil(num[0]/36.0);
}
return res;
}
int main()
{
while(true)
{
int sum=0;
for(int i=0;i<6;i++)
{
cin>>num[i];
sum+=num[i];
}
if(!sum) break;
cout<<Solve()<<endl;
}
return 0;
}