poj1017

一、题意:有底面积为1*1,2*2,...,6*6高为h的物品若干,求用最少的包装盒包装好这些物品,其中包装盒的大小固定为底面积6*6,高为h

二、思路:贪心。先放大的,然后用小的尽量去凑满这个包装盒,从6到1类推。我用的是比较暴力的方法,每一种情况都考虑出来,然后模拟。

三、代码:

#include"iostream"
#include"stdio.h"
#include"math.h"
using namespace std;

int num[7];

int Solve()
{
    int res=num[5];
    res+=num[4];
    num[0]-=num[4]*11;
    res+=num[3];
    if(num[1]<num[3]*5)
    {
        num[0]-=(20*num[3]-4*num[1]);
    }
    num[1]-=num[3]*5;
    res+=num[2]/4;
    int numLeave=num[2]%4;
    if(numLeave>0) res++;
    switch(numLeave)
    {
    case 1:
        if(num[1]<5)
        {
            if(num[1]>0)
            {
                num[0]-=(27-num[1]*4);
                num[1]=0;
            }
            else
                num[0]-=27;

        }
        else
        {
            num[1]-=5;
            num[0]-=7;
        }
        break;
    case 2:
        if(num[1]<3)
        {
            if(num[1]>0)
            {
                num[1]=0;
                num[0]-=(18-num[1]*4);
            }
            else
                num[0]-=18;
        }
        else
        {
            num[1]-=3;
            num[0]-=6;
        }
        break;
    case 3:
        if(num[1]<1)
        {
            num[0]-=9;
        }
        else
        {
            num[1]-=1;
            num[0]-=5;
        }
        break;
    default:
        break;
    }
    if(num[1]>0)
    {
        res+=num[1]/9;
        if(num[1]%9>0)
        {
            res++;
            num[0]-=(36-4*(num[1]%9));
        }
    }
    if(num[0]>0)
    {
        res+=ceil(num[0]/36.0);
    }
    return res;
}

int main()
{
    while(true)
    {
        int sum=0;
        for(int i=0;i<6;i++)
        {
            cin>>num[i];
            sum+=num[i];
        }
        if(!sum) break;
        cout<<Solve()<<endl;
    }
    return 0;
}

  

posted @ 2018-10-22 21:23  Run_For_Love  阅读(132)  评论(0编辑  收藏  举报