poj百炼 1017:装箱问题

Time Limit: 1000ms  Memory Limit: 65536kB
Description
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
Input
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。
Output
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
Sample Input
0 0 4 0 0 1 
7 5 1 0 0 0 
0 0 0 0 0 0 
Sample Output
2 
1
thinking:题目描述有6种箱子和一种包裹,其中6*6,5*5,4*4型号的箱子只能用一个包裹来装一个这种箱子,不能插入到为装满的包裹里。而3*3的箱子比较麻烦,也需要另开一个包裹来装,但这个个包裹可以装多个3*3的箱子,故装3*3的箱子的包裹余下的空间可能多种情况,要分别讨论。
     设a,b,c,d,e,f分别为1*1,2*2,3*3, 4*4,5*5,6*6的箱子数。因为一个包裹最多能装4个3*3类的箱子,所以用包裹装3*3类型的箱子可能会出现的情况为:当c%4==1时,包裹只装了一个3*3类型箱子,余下的空间可以装5个2*2类型的箱子(暂时不讨论1*1类型);当c%4==2时,包裹装了2个3*3类型的箱子,余下的空间可以装3个2*2类型的箱子;当c%4==3时,包裹装了3个3*3类型的箱子,余下的空间可以装1个2*2类型的箱子。一个包裹装一个4*4类型的箱子(最多一个这个类型),剩下的空间可以装5个2*2类型的箱子。一个包裹装一个5*%类型的箱子(最多一个这个类型),剩下的空间可以装0个2*2类型的箱子。一个包裹装一个6*6类型的箱子(最多一个这个类型)。
    讨论完包裹装箱子的情况后,首先要确定装3*3, 4*4, 5*5, 6*6需要箱子N的数,N=f+e+d+(c+3)/4;(用(c+3)/4表示3*3箱子需要的包裹数),再在这N个包裹里面插入2*2的包裹,设可以插入y个,y=5*d
+u[c%4](u={0, 5, 3, 1}),如果y<b,则N+=(b-y+8)/9;最后再N个包裹里插入1*1箱子,设可插入数为x=  36*N - 36*f - 25*e - 16*d -9*c - 4*b, 如果x<a,则N+=(a-x+35)/36;可求得N;
c代码:
#include <stdio.h>

int main()
{
int a , b , c , d , e , f , x , y , sum;
int u [ 4 ] = { 0 , 5 , 3 , 1 };

while( scanf( "%d%d%d%d%d%d" , & a , &b , & c , & d , & e , & f))
{
if( a == 0 &&b == 0 && c == 0 && d == 0 && e == 0 && f == 0)
break;
else
{
sum = f + e + d +( c + 3) / 4;
y = u [ c % 4 ] + 5 * d;
if(b > y)
sum += (b - y + 8) / 9;
x = 36 * sum - 36 * f - 25 * e - 16 * d - 9 * c - 4 *b;
if( a > x)
sum += ( a - x + 35) / 36;
printf( "%d \n " , sum);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值