装箱问题

本文介绍了一种用于计算工厂产品包裹数量的算法。该算法通过合理安排不同尺寸的产品,旨在减少邮寄成本。具体策略包括特定尺寸产品的独立包装及剩余空间的有效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

解决思路
1.4*4, 5*5, 6*6这三个型号的长方体需各占一个包裹;
2.4个3*3的长方体占一个包裹,数量对4取余之后不为0则需要多占一个包裹;
3.计算以上四种型号的长方体装完之后剩余空间可装2*2和1*1的数量,记为count1和count2
4.对比count2与需求数,若空位不够用则根据数量需求再添加包裹,同时更新count2;
5.根据count2更新count1,计算最终需要的包裹总数。

答案

import java.util.Scanner;

public class Test2 {
public static void main(String [] args){
Test2 t = new Test2();
t.input();
}
/**
* 输入方法
*/
public void input(){
Scanner scan = new Scanner(System.in);
while(scan.hasNextLine()){
String lineStr = scan.nextLine();
if(lineStr.startsWith("0 0 0 0 0 0")){
break;
}
String[] boxStr = lineStr.split(" ");
int[] boxInt = new int[boxStr.length];//存储每个的数量boxInt[3]的值,代表有3*3*h的东西有多少个
for(int i=0;i<boxStr.length;i++){
boxInt[i] = Integer.parseInt(boxStr[i]);
}
getPacCount(boxInt);
}
scan.close();
}
/**
* 获取所需箱数量的方法--核心方法
* @param a
*/
public void getPacCount(int [] a){
int count =a[5]+a[4]+a[3];//底面边长为6,5,4的长方体,每一个都需要占用一个单独的包裹
int count1=11*a[4];//每一个边长为5的长方体装入包裹后剩余空间可放置11个底面边长为1的长方体
int count2=5*a[3];//每一个底面边长为4的长方体放入包裹后剩余空间可放置5个底面边长为2的长方体
if(a[2]>0){//如果需要放置底面边长为3的长方体
count=count+a[2]/4;
int m=a[2]%4;
if(m!=0){
count=count+1;
if(m==1){//若对4取余后剩余1个底面边长为3的长方体
count2=count2+5;//则剩余空间可放置五个2*2的长方体
count1=count1+7;//同时可放置7个1*1的长方体
}
else if(m==2){
count2=count2+3;//则剩余空间可放置3个2*2的长方体
count1=count1+6;//同时可放置6个1*1的长方体
}
else if(m==3){
count2=count2+1;//则剩余空间可放置1个2*2的长方体
count1=count1+5;//同时可放置5个1*1的长方体
}
}
}
if(a[1]>0){//如果需要放置2*2的长方体
if(count2>=a[1]){//如果剩余2*2的空间数量>需要放置的2*2长方体的数量
count2=count2-a[1];//剩余2*2的空间的数量做相应的扣减
}
else if(count2<a[1]){//如果剩余2*2的空间数量<需要放置的2*2长方体的数量
count=count+(a[1]-count2)/9;//计算需要用到的箱子数量
int n=(a[1]-count2)%9;//计算取余后剩余的2*2的长方体的数量
count2=0;//因本来剩下的空间不够,所以此时count2=0
if(n!=0){
count=count+1;
count2=9-n;//装完2*2长方体后箱中剩余空间
}
}
}
if(a[0]>0){//如果需要装1*1的长方体
count1=count1+4*count2;//获取装完其它的长方体后所有的剩余空间
if(count1<a[0]){//如果剩余空间不够装,够装的话就不需要任何处理了
count=count+(a[0]-count1)/36;
if((a[0]-count1)%36!=0){
count=count+1;
}
}
}
System.out.println(count);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值