贪心算法 Problem R 1017 求最少所需包裹

Problem R  Problem ID:1017


简单题意:物品共有六种规格:1*1, 2*2, 3*3, 4*4, 5*5, 6*6,它们将被放到6*6的包裹里送到客户手中。已知各个规格的物品数量,求最少需要多少个包裹。


解题思路形成过程:从6*6的物品开始往下遍历,优先放更大的物品:

①每个6*6的物品单独占一个包裹;

②5*5的物品还可以一起放置11个1*1的物品;

③4*4的物品可以一起放置5个2*2的物品;

④3*3的物品可以一起放置3个3*3的物品或5个2*2+7个1*1的物品;

⑤2*2的物品可以一起放置8个2*2的物品或32个1*1的物品

⑥一个包裹里如果全部放1*1的物品则可以放置36个。
(上述过程中如果2*2的物品已经放完,则每个2*2的物品可以换成4个1*1的物品)

感想:注意细节。不知道哪里出错时可以尝试自己写一些例子进行测试。


代码:

#include
#include
using namespace std;
int a[6];
void de1(int n)
{
    if(a[0]<=n)
        a[0]=0;
    else
        a[0]-=n;
}

void de2(int n)
{
    if(a[1]>=n)
        a[1]-=n;
    else
    {
        int m=4*(n-a[1]);
        a[1]=0;
        de1(m);
    }
}

void de3(int n)
{
    if(a[2]>=n)
        a[2]-=n;
    else if(a[2]==0){
        de2(5);
        de1(7);
    }
    else if(a[2]==1){
        a[2]=0;
        de2(3);
        de1(6);
    }
    else if(a[2]==2){
        a[2]=0;
        de2(1);
        de1(5);
    }
}

int main()
{
    while(1){
        int cnt=0;
        scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
        if((a[0]||a[1]||a[2]||a[3]||a[4]||a[5])==false)
            return 0;
        if(a[5]){
            cnt+=a[5];
            a[5]=0;
        }
        for(int i=4;i>=0;--i){
          if(i==4)
            while(a[i]){
            --a[i];
            de1(11);
            ++cnt;
            }
          else if(i==3)
            while(a[i]){
                --a[i];
                de2(5);
                ++cnt;
            }
          else if(i==2)
            while(a[i]){
                --a[i];
                de3(3);
                ++cnt;
            }
          else if(i==1)
            while(a[i]){
                --a[i];
                de2(8);
                ++cnt;
            }
          else if(i==0)
            while(a[i]){
                --a[i];
                de1(35);
                ++cnt;
            }
        }
        cout<


你可能感兴趣的:(贪心算法)