装箱问题

装箱问题

问题描述:

一个工程制造的产品形状都是长方体,它们的高度都是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;
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值