本文最先发表在本人的个人博客
http://www.lovestblog.cn
先把题目晒出来,这个题目不是很难,但是当时仅仅因为输出的问题折腾了我大半天,在ACM提供的运行环境中只有到最后才能把结果输出,不能在中途就把结果输出来,不然老师看见那红色的
Wrong Answer,对于ACMER来说这是最不想看到的结果了,我们最喜欢看到蓝色的
Accepted,呵呵,因为这样就说明你的程序通过了。
Description
一个工厂制造的产品形状都是长方体,它们的高度都是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
这就是题目了,这是北大ACM在线答题中的一道题目,看了下那通过率为38%(3875/10153),即总共提交了10153次,答案完全正确的是3875次,高人还是蛮多的,所以我一般选择的题目都是难度在百分之三十多左右的,太难的我不敢做,有兴趣的可以去网站上看看http://poj.grids.cn/problemlist,注册个用户答答题也蛮有意思的,但是只提供你有限的测试数据,当然当你提交的时候就不是几组测试数据了,难度还是比较高的,稍不留神就通不过。
对于这道题我最初这么思考的,对于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);
}
}
}
分享到:
相关推荐
三维装箱问题是一种经典的组合优化问题,涉及到在有限的三维空间内如何有效地放置不同尺寸的物品,以最大化容器的利用率或最小化所需的容器数量。在物流、仓储、包装设计等领域有广泛应用。这个问题的复杂性在于它...
《三维装箱问题及其解决方案——遗传算法与模拟退火》 在物流、仓储及制造业等领域,如何高效地利用有限的空间来装载物品是一个重要的优化问题,这就是所谓的“三维装箱问题”(3D Bin Packing Problem)。它涉及到...
一维装箱问题,也称为一维背包问题或一维空间分配问题,是组合优化领域的一个经典问题。在物流、仓库管理、生产计划等实际场景中广泛应用。问题的基本设定是:有一系列物品,每个物品都有一定的长度(或重量),目标...
### 集装箱的装箱问题(C语言算法) #### 一、问题背景与描述 在实际工业生产中,为了最大化利用空间资源,经常需要解决如何高效地将各种形状和大小的物品装入特定容器中的问题。其中,集装箱装箱问题就是这类问题...
数学建模-装箱问题PPT课件 数学建模中的装箱问题是指寻找一种方法,使得能以最小数量的箱子数将n个物品J1,J2,…,Jn全部装入箱内。这个问题是一个经典的组合优化问题,有着广泛的应用,在日常生活中也屡见不鲜。 ...
三维装箱问题,也称为三维背包问题或者三维堆叠问题,是运筹学中的一个经典问题,属于组合优化的范畴。在物流、仓储、制造业等领域有着广泛的应用,它旨在找到最优的方式将不同尺寸的物品放入有限的三维空间(长、宽...
实验2装箱问题-贪心算法 在本实验中,我们将学习贪心算法的设计和实现,以解决装箱问题。贪心算法是一种常用的近似算法,通过选择当前最优解来逐步构建解决方案。 问题描述 装箱问题是计算机科学中的一类经典问题...
三维装箱问题,也称为三维空间填充问题,是物流、仓储和包装领域中常见的优化问题。在该问题中,目标是找到一个最佳方式将不同尺寸的物体放入一个三维空间(箱子)内,使得空间利用率最高,同时保持物体间不相交。...
数学建模装箱问题PPT学习教案 数学建模装箱问题是一种经典的组合优化问题,它有广泛的应用,在日常生活中也屡见不鲜。装箱问题是指寻找一种方法,使得能以最小数量的箱子数将物品装入箱内。 装箱问题的描述: 设...
在IT领域,装箱问题(Packing Problem)是一种经典的组合优化问题,广泛应用于物流、生产计划、计算机图形学等多个方面。这里的"矩形_装箱_矩形框_装箱问题直观_"指的是如何通过可视化的方式,用矩形框来解决装箱...
【基于遗传算法的多维装箱问题的研究】 装箱问题是一个经典的组合优化难题,属于NP完全问题范畴。它涉及到在考虑容器的承重、体积等限制条件下,如何有效地分配物品到有限数量的容器中,以达到空间利用率的最大化,...
标题中的“matlab二维装箱问题求解”指的是在MATLAB环境下解决二维装箱问题的算法实现。二维装箱问题,也称为二维包装问题或二维布局问题,是运筹学和组合优化领域的一个经典问题。它涉及到如何在有限大小的二维空间...
二维装箱问题顾名思义就是将若干个矩形物品装进矩形箱子中,并且在装箱的过程中不允许将矩形物品斜着放(PS:下图就是不允许的装箱操作),同时在装箱过程中允许将物品旋转90度放置(但是为了简单地求解问题,我们...
装箱问题,也被称为 bin packing problem,是运筹学和计算机科学中的一种经典优化问题。在实际场景中,它常用于资源分配、物流规划、内存管理等领域。此问题的目标是将一定数量和大小的物品有效地放入有限数量和大小...
### 装箱问题的相关文献资料 #### 一、引言 装箱问题(Bin Packing Problem)是计算机科学与运筹学领域中的一个重要且经典的优化问题。它涉及到将一组物品分配到数量最少的容器(箱子)中,每个容器都有一定的容量...
二维装箱问题是一种经典的组合优化问题,常在物流、仓储、印刷、电子设备布局等领域中出现。该问题的目标是寻找最优的方式将多个矩形地块(物品)放入一个或多个矩形区域(箱子)中,使得空间利用率最大化或者浪费...
"基于遗传优化算法的三维装箱问题的优化仿真,matlab2021a测试"这一项目聚焦于利用先进的算法解决实际问题,即如何高效地在三维空间内放置物品,最大化空间利用率并减少浪费。遗传优化算法是一种模仿生物进化过程的...
针对二维矩形条带装箱问题提出了一种启发式布局算法,即底部左齐择优匹配算法(lowest—level left align bestfit,简称LLABF).LLABF算法遵循最佳匹配优先原则,该原则综合考虑完全匹配优先、宽度匹配优先、高度...
在装箱问题中,目标是尽可能少地使用容量为V的箱子来装满n种不同体积的物品,每种物品的体积不超过V。这是一个典型的优化问题,因为不同的装箱方式可能会导致不同的箱子数量。贪婪算法在此问题中的应用是将物品按照...