题解装箱问题

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解装箱问题相关的知识,希望对你有一定的参考价值。

题目描述

        一个工厂制造的产品形状都是长方体,它们的高度都是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

 

题解

         容易想到的贪心思路:

         (1)放3*3,4*4,5*5,6*6

         (2)用1*1填充放5*5箱子的剩余空间

         (3)先用2*2填充放4*4箱子的剩余空间,再用1*1填充放4*4箱子的剩余空间

         (4)先用2*2填充放3*3箱子的剩余空间,再用1*1填充放3*3箱子的剩余空间

         (5)把4个1*1看作1个2*2,最后多出来的1*1也看作1个2*2,这样就把所有的1*1转化成2*2

         (6)放剩余的2*2

技术图片
#include <iostream>

using namespace std;

int a, b, c, d, e, f;
int ans;

int main()
{
    int tmp;
    while(cin >> a >> b >> c >> d >> e >> f && (a || b || c || d || e || f))
    {
        ans = (c + 3) / 4 + d + e + f;
        a = max(0, a - e * 11);
        tmp = max(0, d * 5 - b);
        b = max(0, b - d * 5);
        a = max(0, a - tmp * 4);
        c %= 4;
        if(c)
        {
            tmp = max(0, (5 - (c - 1) * 2) - b);
            b = max(0, b - (5 - (c - 1) * 2));
            a = max(0, a - tmp * 4);
            a = max(0, a - (7 - (c - 1) * 2));
        }
        ans += ((a + 3) / 4 + b + 8) / 9;
        cout << ans << "\n";
    }
    return 0;
参考程序

 

         根据上面我们可以看出,2*2只需要用来填充放4*4和3*3的箱子,那我们也可以先算出填充完后剩余的2*2还需要多少个箱子。此时我们先更新$ans$。

        容易想到,其实1*1需要填充的数量也就是$ans \times 36$再减去其它大小产品所占的空间。我们最后再加上填充完后剩余的1*1还需要多少个箱子即可。

技术图片
#include <iostream>

using namespace std;

const int t[4] = {0, 5, 3, 1};
int a, b, c, d, e, f;
int ans;

int main()
{
    int tmp;
    while(cin >> a >> b >> c >> d >> e >> f && (a || b || c || d || e || f))
    {
        ans = f + e + d + (c + 3) / 4;
        ans += (max(0, b - d * 5 - t[c % 4]) + 8) / 9;
        ans += (max(0, a - ans * 36 + b * 4 + c * 9 + d * 16 + e * 25 + f * 36) + 35) / 36;
        cout << ans << "\n";
    }
    return 0;
}
参考程序

 

 

以上是关于题解装箱问题的主要内容,如果未能解决你的问题,请参考以下文章

题解玩具装箱

BZOJ1010:[HNOI2008]玩具装箱——题解

1014 装箱问题 CODE[VS]

粒子群算法求解三维装箱问题matlab代码

二维装箱基于matlab遗传算法求解矩形地块二维装箱放置优化问题含Matlab源码 1556期

BZOJ 1010: [HNOI2008]玩具装箱toy | 单调队列优化DP