装箱问题的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

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);
}
}
}

时间: 2024-12-31 13:21:10

装箱问题的Java实现的相关文章

java自动拆箱和装箱问题,相等判断问题

问题描述 public static void main(String[] args) {Integer a = 1;Integer b = 2;Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;int ee = 321;int ff = 321;Long g = 3L;System.out.println(c==d);System.out.println(e==f);System.out.println(ee==ff);Sy

Java装箱和拆箱详解

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 若有不正之处,请谅解和批评指正,不胜感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3780005.html 一.什么是装箱?什么是

c语言来实现贪心算法之装箱问题_java

装箱问题,贪心算法求近似最优解 复制代码 代码如下: import java.util.Arrays; import java.util.Comparator; //装箱问题,贪心算法 public class Enchase {     public void test1() {         Integer[] boxs={34,6,40,2,23,12,12};         int boxCaptation=40;//箱子容量         //倒序         Arrays.

诊断 Java 代码:设计轻松的代码维护

设计 本月,Eric Allen 解释了在使代码更易于维护的同时,避免和控制无理由的变化怎么会是保持代码健壮性的关键.他集中讨论了诸如函数样式代码编写之类的概念,以及标记字段.方法和类的方法来处理并防止可变性.Eric 还解释了本任务中单元测试和重构的角色,并提供了协助实现重构的两个工具.在相关论坛中与作者和其他读者分享您对本文的看法.(您也可以单击本文顶部或底部的"讨论",访问该论坛.)有效调试源自良好的编程.设计易于维护的程序是程序员面临的最困难挑战之一,其部分原因在于程序通常并不

win7上java环境变量设置方法

  Java程序依赖JDK,就像C#程序依赖.NetFrameWork一样. 所以在开发之前,必须在win7或者是linux上,安装jdk(JavaDevelopkit)里面包括java一些工具,还有JRE(JavaRuntimeEnvironment)Java运行环境. 系统:windows7 jdk版本:jdk1.7 安装路径:c:/java 安装JDK时,上图显示的公共JRE和后续单独安装的JRE是一样的.所以只装一个就可以了. 按如上步骤操作,显示出环境变量的配置界面. 新建,添加 变量

Java新手入门教程:新手必须掌握的30条Java基本概念

  Java新手必看教程是什么?当然是绿茶小编带来的Java入门需掌握的30个基本概念啦,掌握了这些概念对于学习Java大大有利,正在学习Java编程的同学们快来看看吧. 1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大 限度上

Java有哪些常用语?Java常用语言汇总

  Java有哪些常用语?不介绍Java 常用语,对Java 的总体介绍就是不完整的.尽管促使Java 诞生的源动力是可移植性和安全性,但在Java 语言最终成型的过程中,其他一些因素也起了重要的作用.接下来,绿茶小编就一一来介绍一下. · 简单(Simple) · 安全(Secure) · 可移植(Portable) · 面向对象(Object-oriented) · 健壮(Robust) · 多线程(Multithreaded) · 体系结构中立(Architecture-neutral)

Java环境变量怎么配置?Java环境变量设置教程

  Java环境变量怎么设置?Java语言拥有跨平台的特性,它编译的程序能够运行在多种操作系统平台上,可以实现"一次编写,到处运行"的强大功能.但是Java需要自己手动配置环境变量,这对于Java新手来说是个不小的难题.接下来,小编就教大家Java环境变量设置方法. Java环境变量设置所需工具: JDK 1.7 安装包 Java环境变量设置步骤: 想要成功配置Java的环境变量,那肯定就要安装JDK,才可以开始配置. 1.安装JDK 向导进行相关参数设置.如图: 4.选择安装的路径,

java实现短地址服务

假设下面是你的视频网站链接列表,如果别人想爬取你的数据十分轻松,看规则就知道数据库是序列自增的 http://www.xxxx.com/video/1 http://www.xxxx.com/video/2 http://www.xxxx.com/video/3 那么解决这一问题,我们可以使用短地址,不对外暴露真实链接,使用对称加密是一个很好的方案. Hashids是一个很好的选择,它提供了JS/PHP/JAVA/PYTHON等编程语言的实现,这里我使用的就是它. 下面是我基于blade框架搭建