装箱问题

1、问题描述:

      一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有6个型号,它们的长度和宽度分别是1X1,2X2,3X3,4X4,5X5,6X6。这些产品通常使用一个6X6Xh的长方体包裹包装,然后邮寄给客户。因为邮费很贵,所以工厂要想方设法地减少每个订单运送时的包裹数量。他们需要有一个好的程序以解决这个问题从而节省费用。现在这个程序你来设计。

2、输入数据:

      每个订单信息用包括6个整数的一行数据表示,中间用空格隔开,分别为1至6这6种产品的数量。

3、输出要求:
      除了输入一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

4、输入样例

      0 0 4 0 0 1

      7 5 1 0 0 0

      0 0 0 0 0 0

5、输出样例

       2

       1
6、解题思路:

  分析6个型号的产品占用箱子的具体情况如下:6X6的产品每个会占用一个完整的箱子,并且没有空余的空间;5X5的产品每个占用一个新的箱子,并且留下11个可以盛放1X1的产品的空余空间;4X4的产品每个占用一个新箱子,并且留下5个可以盛放2X2的产品的空余空间;3X3的产品比较复杂,首先3X3的产品不能放在原来盛放5X5或者4X4的箱子中,那么必须为3X3的产品另开新的箱子,新开的箱子数目等于3X3的产品的数目除以4向上取整;同时需要讨论为3X3的产品新开箱子时,剩余的空间可以盛放多少2X2和1X1的产品(这里如果空间可以盛放2X2的产品,就将它记入2X2的空余空间,等到2X2的产品全部装完,如果还有2X2的空间剩余,再将它们转换成1X1的剩余空间)。分情况讨论为3X3的产品打开的新箱子额中剩余的空位,共为4种情况:第一种,3X3的产品的数目正好是4的倍数,所以没有空余空间;第2种,3X3的产品数目是4的倍数加1,这时还剩5个2X2的空位和7个1X1的空位;第3种,3X3的产品数目是4的倍数加2,这时还剩3个2X2的空位和6个1X1的空位;第4种,3X3的产品的数目是4的倍数加3,这时还剩1个2X2的空位和5个1X1的空位;处理完3X3的产品,就可以比较一下剩余的2X2的空位和2X2产品的数目,如果产品数目多,就将2x2的空位全部填满,再为2x2的产品打开新箱子,同时计算新箱子中1x1的空位,如果剩余空位多,就将2x2的产品全部填入2x2的空位,再将剩余的2x2空位转换成1x1的空位;最后处理1x1的产品,比较一下1x1的空位与1x1的产品数目,如果空位多,将1x1的产品全部填入空位,否则,先将1x1的空位填满,然后再为1x1的产品打开新的箱子。

7、完整代码:

#include<string.h>
#include<stdio.h>
#include<math.h>
 
int main()
{
    int a,b,c,d,e,f,x,y;
    int n = 0;
    int q[4] = {0,5,3,1};//3x3的木箱装完后剩余可以装多少2x2的木箱 
    scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
    n = f+e+d+(c+3)/4;//先算出3×3,4×4,5×5,6×6,占用的包装盒 
    x = 5*d+q[c%4];//计算剩余空间可以装多少2x2 
    if(b > x)
        n += (b-x+8)/9;//计算剩余空间没装完的2x2再需要几个包装来装完 
    y = 36*n-36*f-25*e-16*d-9*c-4*b;//计算还剩余多少空间来装1x1的 
    if(a > y)//如果不够装,再用新的包装来装 
        n += (a-y+35)/36;
    printf("%d",n);
    /* 
	   像c+3)/4、(b-x+8)/9 、(a-y+35)/36 这样是为了只要有一个多余就要
	   
	   启用一个新的包装,如;c=5,则(5+3)/4=2;即虽然多出一个也要用新的包装 
	*/ 
}

  

 

posted on 2020-05-06 18:28  满船清梦压星河1024  阅读(603)  评论(0)    收藏  举报