貪心算法——裝箱問題

Central Europe 1996

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

思路:
1.求6*6的產品所需要的箱子數;
2.求5*5+1*1所需要的箱子數;
3.求(4*4+2*2)+(4*4+1*1+1*1)所需要的箱子數;
4.求(3*3+3*3)+(3*3+2*2+1*1)+(3*3+1*1+1*1+1*1)所以需要的箱子數;
(以上四步所需要的箱子數較好求,可做合併)
5.求剩餘產品所需要的箱子數,先裝大的再裝小的。

代碼實現:
#include <bits/stdc++.h>
using namespace std;
int a[7],u[5]={0,5,3,1};//u[i]記錄裝入i個3*3的產品後可裝入的2*2的產品的數量,通過畫圖找規律可得
int main()
{
    while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]){
        int sum=0;
        if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
            break;
        else{
            sum+=a[6]+a[5]+a[4]+ceil(a[3]/4.0);//完成前四步計算
            int n2=5*a[4]+u[a[3]%4];//計算裝4*4和3*3的箱子中剩下體積爲2*2空間的數量
            if(a[2]>n2)sum+=ceil((a[2]-n2)/9.0);//2*2需要單獨放的箱子數量
            int n1=36*(sum-a[6])-a[5]*25-a[4]*16-a[3]*9-a[2]*4;//計算前面箱子所剩1*1面積
            if(a[1]>n1)sum+=ceil((a[1]-n1)/36.0);//1*1需要單獨放的箱子數量
            cout<<sum<<endl;
        }
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章