装箱问题
问题描述:
一个工程制造的产品形状都是长方体,它们的高度都是h,长和宽相等,一共有6种型号,每种型号的长度和宽度分别为1*1、2*2、3*3、4*4、5*5、6*6。这些产品通常使用6*6*h的长方体箱子包装并邮寄给客户。因为邮费很贵,所以工厂要想方设法的减少每个订单运送时的箱子数量。工厂需要一个好的程序来解决这个问题从而节省费用。请设计这个程序。
输入数据:
输入包括多行,每一行代表一个订单。每个订单包括6个整数K1,K2,……,K6,中间用空格分开,分别为1*1~6*6这6种产品的数量。输入文件以6个0结尾。
输出要求:
除了输入的最后一行6个0外,输入的每一行对应输出的一行,每一行输出一个整数,代表对应的订单所需要的最小包裹数。
输入样例:
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
输出样例:
2
1
解题思路:
(1)先将长宽大于3*3的产品放入箱子中。
(2)比较剩下的2*2的空位和长宽为2*2的产品的数量。
如果空位较多,就将产品全部放入空位中,然后多出的空位装长宽为1*1的产品。
如果空位较少,就打开新的箱子放多出来的长宽为2*2的产品,然后再安排剩下的空位装长宽为1*1的产品。
(3)将剩余的长宽为1*1的产品装入新的箱子中。
程序代码:#include<stdio.h>
int main()
{
int n,a,b,c,d,e,f,x,y;
/*
x表示1*1的空位数目
y表示2*2的空位数目
*/
int u[4] = {0,5,3,1};
/*
表示3*3的产品分别是4k,4k+1,4k+2,4k+3时,
为3*3产品打开的新箱子中剩余2*2的空位数
*/
while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF)
{
if(a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0)
break;
n = f + e + d + (c + 3) / 4;
y = 5 * d + u[c % 4];
//长宽大于或等于3*3的产品所占的新箱子数目
if(b > y)
n += (b - y + 8) / 9;//多出来的2*2箱子应该占用的新箱子数
x = 36 * n - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;
//所有箱子剩下的1*1空格
if(a > x)
n += (a - x + 35) / 36;
printf("%d\n",n);
}
return 0;
}
#include<stdio.h>
int main()
{
int n,a,b,c,d,e,f,x,y;
/*
x表示1*1的空位数目
y表示2*2的空位数目
*/
int u[4] = {0,5,3,1};
/*
表示3*3的产品分别是4k,4k+1,4k+2,4k+3时,
为3*3产品打开的新箱子中剩余2*2的空位数
*/
while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF)
{
if(a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0)
break;
n = f + e + d + (c + 3) / 4;
y = 5 * d + u[c % 4];
//长宽大于或等于3*3的产品所占的新箱子数目
if(b > y)
n += (b - y + 8) / 9;//多出来的2*2箱子应该占用的新箱子数
x = 36 * n - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;
//所有箱子剩下的1*1空格
if(a > x)
n += (a - x + 35) / 36;
printf("%d\n",n);
}
return 0;
}