問題:
一個工廠制造的產品形狀都是長方體,它們的高度都是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);
}
}
}