题目 http://poj.org/problem?id=1017
大致题意:
一个工厂制造的产品形状都是长方体盒子,它们的高度都是 h,长和宽都相等,一共有六个型号,分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。
这些产品通常使用一个 6*6*h 的长方体箱子包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的箱子数量BoxNum。
解题思路:
由于盒子和箱子的高均为h,因此只需考虑底面积的空间。
6*6的盒子,每个盒子独占一个箱子。
5*5的盒子,每个盒子放入一个箱子,该箱子的剩余空间允许放入的最大尺寸为1*1,且最多放11个。
4*4的盒子,每个盒子放入一个箱子,该箱子的剩余空间允许放入的最大尺寸为2*2。
3*3的盒子,每4个刚好独占一个箱子,不足4个3*3的,剩下空间由2*2和1*1填充。
2*2的盒子和1*1的盒子主要用于填充其他箱子的剩余空间,填充后的多余部分才开辟新箱子装填。
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int s1,s2,s3,s4,s5,s6; //6中不同尺寸的盒子数目
while(~scanf("%d %d %d %d %d %d",&s1,&s2,&s3,&s4,&s5,&s6)&&(s1+s2+s3+s4+s5+s6))
{
int Boxnum=0; //我们需要的盒子数目
//6*6的单独 装一个
Boxnum+=s6;
// 一个 5*5 和 11个 1*1 拼一个盒子
Boxnum+=s5;
s1=max(0,s1-11*s5);
// 一个 4*4 和 5个 2*2 或者 4*4 + 20个 1*1
Boxnum+=s4;
if(s2>=s4*5) //如果2*2 的够多 用2*2的填补空出来的位置
{
s2=max(0,s2-5*s4);
}
else
{
s1=max(0,s1-4*(s4*5-s2)); //否则 s1填补剩余的位置(一个2*2的盒子可以用4个1*1去补位)
s2=0; // s2归0
}
// 3*3的盒子 4个3*3
// 或者 1个3*3+5个2*2+7个1*1
// 2*s3+3*s2+6*s1 或者 3*s3+s2+5*s1
Boxnum+= (s3+3)/4; //看3*3的够放在几个盒子里
s3%=4; //3*3 的 是否剩余
if(s3)
{
// 根据上面所写,2*2的盒子与3*3的盒子组合时 是 2*2的个数为7-2*(3*3的个数)
if(s2>=7-2*s3)
{
s2=max(0,s2-(7-2*s3)); //当2*2的盒子足够多时
s1=max(0,s1- (36-9*s3-4*(7-2*s3) ) ); //其余的用1*1去填补空缺
}
else
{
s1=max(0,s1-(36-s3*9-s2*4)); // 把2*2的盒子全用上之后剩余的用1*1补
s2=0;
}
}
// s2 2*2的不够用1*1的补位
Boxnum+=(s2+8)/9;
s2%=9;
if(s2)
{
s1=max(0,s1-(36-s2*4));
}
// s1
Boxnum+=(s1+35)/36;
printf("%d\n",Boxnum);
}
return 0;
}