贪心算法——装箱问题

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;

}

思路参考:
https://blog.csdn.net/qq_34940287/article/details/77411224

 

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/TFrui_/article/details/81007889
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞