贪心算法——北大1017

1017:装箱问题

时间限制:
1000ms
内存限制:
65536kB
描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。
输出
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
样例输入
0 0 4 0 0 1 
7 5 1 0 0 0 
0 0 0 0 0 0 
样例输出
2 
1
分析:用贪心算法先填大的,再填小的! 
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int a[7],b[3],cont,p;
    while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]),a[1]||a[2]||a[3]||a[4]||a[5]||a[6])
    {
        cont =0;
        cont+=a[6]+a[5]+a[4]+ceil(a[3]/4.0);//6,5,4的都必须独占一个,3是4个独占
        memset(b,0,sizeof(b));
        b[1]+=11*a[5];//5里只能再放1了
        b[2]+=5*a[4];//4里全放2
        if(a[3]%4==1)
        {
            b[2]+=5;//只有一个3时,可以放5个2,7个1
            b[1]+=7;
        }
        else if(a[3]%4==2)//有两个3时,可以放3个2,6个1
        {
            b[2]+=3;
            b[1]+=6;
        }
        else if(a[3]%4==3)//有三个3时,可以放1个2,5个1
        {
            b[2]+=1;
            b[1]+=5;
        }
        if(b[2]>=a[2])//2够用时
        {
            b[1]+=(b[2]-a[2])*4;//还剩几个1
            if(b[1]<a[1])  cont+=ceil((a[1]-b[1])/36.0);
        }
        else//不够用
        {
            cont+=ceil((a[2]-b[2])/9.0);
            if((a[2]-b[2])%9==0) //增加的正好被2填满
                p=0;
            else //没填满
                p=9-(a[2]-b[2])%9;
            b[1]+=p*4;//还剩几个1
            if(b[1]<a[1])  cont+=ceil((a[1]-b[1])/36.0);
        }
        printf("%d\n",cont);
    }
    return 0;
}



        

 

posted @ 2012-08-23 13:06  萧凡客  阅读(417)  评论(0编辑  收藏  举报