欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

装箱问题 博客分类: 算法 java装箱 

程序员文章站 2024-03-25 15:09:22
...
描述
一个工厂制造的产品形状都是长方体,它们的高度都是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);
	}
}

相关标签: java 装箱