装箱问题的Java实现

开发 后端
以下讲述精点问题在java中是如何实现的全过程。

问题:

 一个工厂制造的产品形状都是长方体,它们的高度都是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以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

对于6*6的一个箱子来说,最多只能放一个6*6或一个5*5或4*4的盒子,所以我们初始化需要的箱子数时就是这这几种箱子的个数和,对于3*3的箱子来说,我们可以放一个或2个或3个或4个,这我们可以通过整除和取模来确定放了3*3盒子的箱子数,再把它加入到总箱子数中,接下来我们就是把1*1和2*2的盒子塞进前面所需的箱子中,当塞不完时再来新增盒子,我们首先要将前面的箱子剩余的空间统计出来,并且要以2*2的优先考虑,因为我们可以把多余的2*2的位置变为填充4个1*1的,毕竟1*1的只要有空间随处都可以塞。所以当我们的箱子要是装了1个5*5的盒子的话,那么它就只能塞1*1的了,一个可以塞11个1*1的,对于装了4*4的盒子的话,那么还可以装5个2*2的盒子,暂且不要去转话成1*1的,除非没办法只能装1*1的,对于3*3的话就可以根据取模之后一个箱子剩下的空间了,如果一个箱子中只放了一个3*3的,那么还剩下3个3*3的空间可以放,我们知道可以放5个2*2的和7个1*1的,对于放了2个3*3的箱子,我们剩下的空间可以放3个2*2的以及6个1*1的,对于放了3个3*3的箱子,我们只能放1个2*2的和5个1*1的,这样一来我们就统计出了此时可以放2*2以及1*1的空间到底有多少,接下来我们就放箱子进去啊,放一个就减一个,知道1*1的和2*2的盒子都放完了,要是还没有放完的话我们就新增箱子或者如果1*1的没放完,而2*2的还有剩,那么就将每个2*2的转化成4个1*1的就行了,具体实现就看下面的代码吧,由于时间关系,就没写注释了。

import java.io.BufferedInputStream;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

public class Test {

    public static void main(String args[]){

        Scanner sc=new Scanner(new BufferedInputStream(System.in));

        boolean flag=true;

        Map map=new HashMap();

        int k=0;

        while(flag){

            int n[]=new int[6];

            n[0]=sc.nextInt();

            n[1]=sc.nextInt();

            n[2]=sc.nextInt();

            n[3]=sc.nextInt();

            n[4]=sc.nextInt();

            n[5]=sc.nextInt();

            if(n[0]==0&&n[1]==0&&n[2]==0&&n[3]==0&&n[4]==0&&n[5]==0){

                flag=false;

            }else{

                map.put(k, n);

                k++;

            }

        }

        for(int i=0;i< map.size();i++){

            int[] vs=(int[])map.get(i);

            int boxNum=0;

            boxNum+=vs[3]+vs[4]+vs[5];

            if(vs[2]>0){

                if(vs[2]%4==0){

                    boxNum+=vs[2]/4;

                }else{

                    boxNum+=vs[2]/4+1;

                }

            }

            int for1=vs[4]*11;

            int for2=vs[3]*5;

            if(vs[2]%4==1){

                for1+=7;

                for2+=5;

            }else if(vs[2]%4==2){

                for1+=6;

                for2+=3;

            }else if(vs[2]%4==3){

                for1+=5;

                for2+=1;

            }

            if(vs[0]< for1){

                vs[0]=0;

            }else{

                vs[0]=vs[0]-for1;

            }

            if(vs[1]< for2){

                if(vs[0]>0){

                    if(4*(for2-vs[1])-vs[0]>=0){

                        vs[0]=0;

                    }else{

                        vs[0]=vs[0]-4*(for2-vs[1]);

                    }

                }

                vs[1]=0;

            }else{

                vs[1]=vs[1]-for2;

            }

            if(!(vs[0]==0&&vs[1]==0)){

                if(vs[1]>0){

                    if(vs[1]%9==0){

                        boxNum+=vs[1]/9;

                    }else{

                        boxNum+=vs[1]/9+1;

                        if(vs[0]>(9-(vs[1]%9))*4){

                            if((vs[0]-(9-(vs[1]%9))*4)%36==0){

                                boxNum+=(vs[0]-(9-(vs[1]%9))*4)/36;

                            }else{

                                boxNum+=(vs[0]-(9-(vs[1]%9))*4)/36+1;

                            }

                        }

                    }

                }else if(vs[0]>0){

                    if(vs[0]%36==0){

                        boxNum+=vs[0]/36;

                    }else{

                        boxNum+=vs[0]/36+1;

                    }

                }

            }

            System.out.println(boxNum);

        }

    }

}

 

【编辑推荐】

  1. Sun推出面向***Java应用的Java软件商店
  2. Java技巧:创建Excel格式的数据
  3. Java的MD5加密类
责任编辑:王观 来源: Java学习室
相关推荐

2015-09-28 08:46:19

Java自动装箱性能

2012-03-26 11:32:45

Java

2020-11-02 13:06:42

Java装箱拆箱

2018-09-05 15:51:25

Java自动拆装箱

2015-09-02 10:12:54

Java自动装箱拆箱

2012-04-09 13:48:22

IDC数据中心云立方

2009-08-26 03:39:00

C#装箱和拆箱

2013-04-08 12:58:37

2017-08-10 09:51:54

DevOps集装箱技术

2017-10-23 10:13:18

IO底层虚拟

2013-05-24 16:10:33

集装箱数据中心华为

2012-07-17 15:37:00

集装箱式数据中心

2012-08-07 09:24:00

模块化数据中心

2012-08-20 19:38:59

云立方集装箱数据中心

2024-03-27 08:28:31

元素拖拽API文件上传

2010-09-07 11:00:42

2020-03-27 20:22:53

数据集装箱网络

2012-08-14 09:26:35

云计算集装箱数据中心IDC
点赞
收藏

51CTO技术栈公众号