百练1017装箱问题

来源:互联网 发布:中国软件同花顺 编辑:程序博客网 时间:2024/06/05 02:45

装箱问题初看没有头绪,但是细想一下会发现,要是最后使用的打包盒最少,应该先放置体积大的盒子,再用体积小的盒子对打包盒的剩余空间进行填充,这是我解这道题的遵循的原则。

我们把1*1和2*2的盒子看成体积小的用来填充的盒子,且在填充时也应遵循,先填2*2,再填1*1.

对于5*5的盒子,每一个这样的盒子就需要一个打包盒,且里面还能填充11个1*1的盒子

对于4*4的盒子,每一个这样的盒子就需要一个打包盒,且里面还能填充5个2*2的盒子

对于3*3的盒子,需要分情况讨论:(3*3的盒子正好4个可以塞满一个打包盒)

1、3*3盒子个数正好是4的整数倍个,那就直接个数除以4就得到相应的打包盒个数

2、3*3盒子个数除以4余1,剩余的空间还能装5个2*2的盒子和7个1*1的盒子

3、余数是2,剩余空间还能装3个2*2的盒子和6个1*1的盒子

4、余数是3,剩余空间还能装1个2*2的盒子和5个1*1的盒子

余下,2*2的盒子和1*1的盒子也可进行类似讨论

代码如下:

package poj_online;import java.util.Scanner;public class Pockets {public static void main(String args[]){Scanner scan=new Scanner(System.in);while(true){int []a=new int[6];a[0]=scan.nextInt();a[1]=scan.nextInt();a[2]=scan.nextInt();a[3]=scan.nextInt();a[4]=scan.nextInt();a[5]=scan.nextInt();if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0)break;int box=function(a);System.out.println(box);}}public static int function(int []a){int b_1=a[0];int b_2=a[1];int b_3=a[2];int b_4=a[3];int b_5=a[4];int b_6=a[5];int sum=b_6;//处理5*5的箱子if(b_5>0){sum+=b_5;if(b_1>=b_5*11)b_1=b_1-b_5*11;elseb_1=0;}//处理4*4的箱子if(b_4>0){sum+=b_4;if(b_2>=5*b_4)b_2=b_2-5*b_4;else{int r_e=20*b_4-4*b_2;b_2=0;if(b_1>=r_e)b_1=b_1-r_e;elseb_1=0;}}//处理3*3的箱子if(b_3>0){sum=sum+b_3/4;if(b_3%4==1){sum++;if(b_2>=5){b_2=b_2-5;if(b_1>=7)b_1=b_1-7;elseb_1=0;}else{int r_e=27-b_2*4;b_2=0;if(b_1>=r_e)b_1=b_1-r_e;elseb_1=0;}}else if(b_3%4==2){sum++;if(b_2>=3){b_2=b_2-3;if(b_1>=6)b_1=b_1-6;elseb_1=0;}else{int r_b=18-4*b_2;b_2=0;if(b_1>=r_b)b_1=b_1-r_b;elseb_1=0;}}else if(b_3%4==3){sum++;if(b_2>=1){b_2=b_2-1;if(b_1>=5)b_1=b_1-5;elseb_1=0;}else{int r_b=9-4*b_2;b_2=0;if(b_1>=r_b)b_1=b_1-r_b;elseb_1=0;}}}if(b_2>0){sum=sum+b_2/9;if(b_2%9!=0){sum++;int r_e=36-4*(b_2%9);if(b_1>=r_e)b_1=b_1-r_e;else b_1=0;}}while(b_1>0){sum++;b_1=b_1-36;}return sum;}}


原创粉丝点击