1. 程式人生 > >19:裝箱問題(4.6演算法之貪心)

19:裝箱問題(4.6演算法之貪心)

19:裝箱問題

總時間限制: 1000ms 記憶體限制: 65536kB
描述
一個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為1*1, 2*2, 3*3, 4*4, 5*5, 6*6。這些產品通常使用一個 6*6*h 的長方體包裹包裝然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法的減小每個訂單運送時的包裹數量。他們很需要有一個好的程式幫他們解決這個問題從而節省費用。現在這個程式由你來設計。
輸入
輸入檔案包括幾行,每一行代表一個訂單。每個訂單裡的一行包括六個整數,中間用空格隔開,分別為1*1至6*6這六種產品的數量。輸入檔案將以6個0組成的一行結尾。
輸出
除了輸入的最後一行6個0以外,輸入檔案裡每一行對應著輸出檔案的一行,每一行輸出一個整數代表對應的訂單所需的最小包裹數。
樣例輸入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
樣例輸出
2
1

#include<iostream>
using namespace std;
//http://noi.openjudge.cn/ch0406/19/
//書上面的解法,真的超級簡潔 
int n,a,b,c,d,e,f,x,y;
int u[]={0,5,3,1}; 
//n個包裹,x是剩餘的2*2的位置,y是剩餘的1*1的位置
//u是3*34取餘後開啟新箱子需要的2*2的個數 
int main(){
    while(cin>>a>>b>>c>>d>>e>>f){
        if(a==0&&b==0&&c==0
&&d==0&&e==0&&f==0)break; n=f+e+d+(c+3)/4; x=5*d+u[c%4]; if(x<b){ n=n+(b-x+8)/9; } y=36*n-36*f-25*e-16*d-9*c-4*b; if(a>y){ n=n+(a-y+35)/36; } cout<<n<<endl; } }