装箱问题

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

猜你喜欢

转载自1454396751.iteye.com/blog/2341834