天天看點

Bailian1017 裝箱問題【貪心】

Bailian1017 裝箱問題

問題描述:(略)

問題分析:

    這個問題與參考連結的題是同一題,隻是翻譯了一下。解題思路參見程式代碼中的注釋。

程式說明:(略)

參考連結:POJ1017 ZOJ1307 UVA311 UVALive5526 Packets【貪心】

題記:

    題做多了難免遇到相同的題。

AC的C語言程式如下:

/* POJ1017 ZOJ1307 UVA311 UVALive5526 Packets */

#include <iostream>
#include <stdio.h>

using namespace std;

const int SIX = 6;
int orders[SIX + 1], sum;
int r33[] = {0, 5, 3, 1};   // r33[i]表示,箱子中裝入i個3*3之後,剩餘2×2空位有幾個

int main()
{
    for(;;) {
        sum = 0;
        for(int i = 1; i <= SIX; i++) {
            scanf("%d", &orders[i]);
            sum += orders[i];
        }
        if(sum == 0)
            break;

        // 先計算6×6、5×5、4×4和3×3需要的箱子數量
        sum = orders[6] + orders[5] + orders[4] + (orders[3] + 4 - 1) / 4;

        // 計算4×4和3×3箱子裝箱後,空餘的2×2的空位有幾個
        int r22 = orders[4] * 5 + r33[orders[3] % 4];

        if(r22 < orders[2])
            sum += (orders[2] - r22 + 9 - 1) / 9;   // 1箱可以裝入9個2×2

        // 計算5×5、4×4、3×3和2×2全部裝箱後,空餘的1×1的空位有幾個
        int r11 = sum * 36 - orders[6] * 36 - orders[5] * 25 - orders[4] * 16 - orders[3] * 9 - orders[2] * 4;

        if(r11 < orders[1])
            sum += (orders[1] - r11 + 36 - 1) / 36;

        printf("%d\n", sum);
    }

    return 0;
}
           

繼續閱讀