装箱问题

装箱问题

一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为11, 22, 33, 44, 55, 66. 这些产品通常使用一个 66h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入数据
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为11至66这六种产品的数量。输入文件将以6个0组成的一行结尾。
输出要求
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

代码如下
#include <stdio.h>
int main(){
int N,a,b,c,d,e,f,x,y;//N表示箱子的数目,x存储22的空位数目,y存储11的空位数目
int u[4]={0,5,3,1};//表示33的产品是4的倍数,4的倍数加一,4的倍数加二,4的倍数加三时所剩余的22的空位的个数
while(1){
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;
N=f+e+d+(c+3)/4;//(c+3)/4等于c除以四向上取整的结果,因为3* 3不可能与4* 4,5 * 5,6 * 6的放在一起
x=5d+u[c%4];//4 * 4与3 * 3可放2 * 2的数目,6 * 6与 5 * 5不可放
if(b>x)
N+=(b-x+8)/9;//若一个箱子只有2 * 2,可装9个。为补完空位后,多出的2 * 2应加的箱子
y=36
N-36f-25e-16d-9c-4b;
if(a>y)
N+=(a-y+35)/36;//一个箱子只有1 * 1,可装36个。为补完空位后,多出的1 * 1应加的箱子
printf("%d\n",N);
}
}
题目分析
(1)一个6 * 6,5
5,4* 4,3* 3的产品都必须占一个箱子。
(2)3* 3的产品较为复杂,4的倍数个3* 3的为一个箱子;4的倍数加1个3* 3的还需5个2* 2的与7个1* 1的;4的倍数加2个3* 3的还需3个2* 2的和6个1* 1的;4的倍数加3个3* 3的还需1个2* 2的和5个1* 1的。
(3)再看2* 2的,可以补3* 3和4* 4的空位,之后若还有剩余,则加箱子。
(4)最后看1* 1的,用总体的数目减去其他5类的数目,即为1* 1可以补得数目,如有剩余,加箱子。
总结
(1)本题与排序有关,要有顺序的思考,才不会乱。
(2)不能够只去凑够36,还要考虑是否符合实际,比如3* 3的不可能与3* 3不可能与4* 4, 5 * 5,6* 6的放在一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值