貪心算法 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<iostream>
#include<stdio.h>
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<<cnt<<endl;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章