贪心算法—Problem R

题意
一个工厂制造的产品形状都是长方体盒子,它们的高度都是 h,长和宽都相等,一共有六个型号,分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体箱子包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的箱子数量BoxNum。
解题思路
由于盒子和箱子的高均为h,因此只需考虑底面积的空间。
6*6的盒子,每个盒子独占一个箱子。
5*5的盒子,每个盒子放入一个箱子,该箱子的剩余空间允许放入的最大尺寸为1*1,且最多放11个。
4*4的盒子,每个盒子放入一个箱子,该箱子的剩余空间允许放入的最大尺寸为2*2。
3*3的盒子,每4个刚好独占一个箱子,不足4个3*3的,剩下空间由2*2和1*2填充。
2*2的盒子和1*1的盒子主要用于填充其他箱子的剩余空间,填充后的多余部分才开辟新箱子装填。
感想
典型的贪心算法,结合数学空间几何,还好标记了标准尺寸,否则难度恐怕更大···
AC代码

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    int num[4]={0,5,3,1};
    int box[7];
    while(1)
    {
        int tmp=0;
        int sum=0;
        for(int i=1;i<=6;i++)
        {
            cin>>box[i];    // 读入每个物品的数目
            tmp+=box[i];
        }
        if(tmp==0)  break;
        sum=box[6]+box[5]+box[4]+(box[3]+3)/4;  //a6,a5,a4,每个物品占有一个箱子(a3+3)/4代表a3的物品需要占用的
        int a2=box[4]*5+num[box[3]%4];  //统计所有的大物品放进箱子中后a2物品的空位子有多少
        if(box[2]>a2)
            sum+=(box[2]-a2+8)/9;
        int a1=sum*36-box[6]*36-box[5]*25-box[4]*16-box[3]*9-box[2]*4;
        if(box[1]>a1)   //求a1的空位子,只需要统计剩余的面积即可
            sum+=(box[1]-a1+35)/36;
        cout<<sum<<endl;
    }
    return 0;
}
    原文作者:贪心算法
    原文地址: https://blog.csdn.net/hero5201/article/details/50999412
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞