Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 609|回复: 0

[算法学习]装箱问题的java实现

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-4 00:01:44 | 显示全部楼层 |阅读模式
    问题:
       一个工厂制造的产品形状都是长方体,它们的高度都是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以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。  
      
      
      Sample Input

    0 0 4 0 0 1
    7 5 1 0 0 0
    0 0 0 0 0 0

    Sample Output

    2
    1

    对于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的就行了,具体实现就看下面的代码吧,由于时间关系,就没写注释了
    1. import java.io.BufferedInputStream;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import java.util.Scanner;
    5. public class Test {
    6.     public static void main(String args[]){
    7.         Scanner sc=new Scanner(new BufferedInputStream(System.in));
    8.         boolean flag=true;
    9.         Map map=new HashMap();
    10.         int k=0;
    11.         while(flag){
    12.             int n[]=new int[6];
    13.             n[0]=sc.nextInt();
    14.             n[1]=sc.nextInt();
    15.             n[2]=sc.nextInt();
    16.             n[3]=sc.nextInt();
    17.             n[4]=sc.nextInt();
    18.             n[5]=sc.nextInt();
    19.             if(n[0]==0&&n[1]==0&&n[2]==0&&n[3]==0&&n[4]==0&&n[5]==0){
    20.                 flag=false;
    21.             }else{
    22.                 map.put(k, n);
    23.                 k++;
    24.             }
    25.         }
    26.         for(int i=0;i< map.size();i++){
    27.             int[] vs=(int[])map.get(i);
    28.             int boxNum=0;
    29.             boxNum+=vs[3]+vs[4]+vs[5];
    30.             if(vs[2]>0){
    31.                 if(vs[2]%4==0){
    32.                     boxNum+=vs[2]/4;
    33.                 }else{
    34.                     boxNum+=vs[2]/4+1;
    35.                 }
    36.             }
    37.             int for1=vs[4]*11;
    38.             int for2=vs[3]*5;
    39.             if(vs[2]%4==1){
    40.                 for1+=7;
    41.                 for2+=5;
    42.             }else if(vs[2]%4==2){
    43.                 for1+=6;
    44.                 for2+=3;
    45.             }else if(vs[2]%4==3){
    46.                 for1+=5;
    47.                 for2+=1;
    48.             }
    49.             if(vs[0]< for1){
    50.                 vs[0]=0;
    51.             }else{
    52.                 vs[0]=vs[0]-for1;
    53.             }
    54.             if(vs[1]< for2){
    55.                 if(vs[0]>0){
    56.                     if(4*(for2-vs[1])-vs[0]>=0){
    57.                         vs[0]=0;
    58.                     }else{
    59.                         vs[0]=vs[0]-4*(for2-vs[1]);
    60.                     }
    61.                 }
    62.                 vs[1]=0;
    63.             }else{
    64.                 vs[1]=vs[1]-for2;
    65.             }
    66.             if(!(vs[0]==0&&vs[1]==0)){
    67.                 if(vs[1]>0){
    68.                     if(vs[1]%9==0){
    69.                         boxNum+=vs[1]/9;
    70.                     }else{
    71.                         boxNum+=vs[1]/9+1;
    72.                         if(vs[0]>(9-(vs[1]%9))*4){
    73.                             if((vs[0]-(9-(vs[1]%9))*4)%36==0){
    74.                                 boxNum+=(vs[0]-(9-(vs[1]%9))*4)/36;
    75.                             }else{
    76.                                 boxNum+=(vs[0]-(9-(vs[1]%9))*4)/36+1;
    77.                             }
    78.                         }
    79.                     }
    80.                 }else if(vs[0]>0){
    81.                     if(vs[0]%36==0){
    82.                         boxNum+=vs[0]/36;
    83.                     }else{
    84.                         boxNum+=vs[0]/36+1;
    85.                     }
    86.                 }
    87.             }
    88.             System.out.println(boxNum);
    89.         }
    90.     }
    91. }
    复制代码

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/4/000143765.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 13:06 , Processed in 0.366690 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表