http://poj.org/problem?id=1017

本题主要利用贪心算法,主要意思就是将1*1,2*2,到6*6的包放进6*6的包里,求出可以使用的最少的包的个数

输入的6个数据分别对应1*1到6*6的包的个数。

//n1到n6记录1*1到6*6的包的个数,t1和t2记录6,5,4,3之后填完所能填充的1*1和2*2的包

1 #include<stdio.h>
2  int main()
3 {
4 int s1[4]={0,7,6,5}; //根据n3%4,判断此包中填入3*3,2*2后还能填入1*1的个数
5 int s2[4]={0,5,3,1}; //根据n3%4,判断此包中填入3*3后还能填入的2*2的个数
6 int n1,n2,n3,n4,n5,n6,t1,t2,sum;
7 while(1)
8   {
9 scanf("%d%d%d%d%d%d",&n1,&n2,&n3,&n4,&n5,&n6);
10 if(n1==0&&n2==0&&n3==0&&n4==0&&n5==0&&n6==0)
11 break;
12 sum=n6+n5+n4+n3/4; //先计算出填完6,5,4,3所需的包的个数
13 if(n3%4!=0) //如果3*3填完后有剩余,补充一个包
14 sum++;
15 t2=5*n4+s2[n3%4]; //所能填入的2*2的包
16 t1=11*n5+s1[n3%4]; //所能填入的1*1的包
17 n2-=t2; //将2*2填入后还能填入的2*2的个数
18 if(n2>0) //如果n2大于0,则在补充包
19 {
20 sum+=n2/9;
21 if(n2%9) //仍有剩余,继续补充一个
22 {
23 ++sum;
24 t1+=36-(n2%9)*4; // 填入2*2后剩余的需用1*1的补充
25 }
26 }
27 else
28 t1-=n2*4; //如果n2小于0,则需用1*1补充
29 n1-=t1; //所能填入的1*1的包
30 if(n1>0) //同n2,添加1*1的包
31 {
32 sum+=n1/36;
33 if(n1%36)//若仍有剩余,再添加一个
34 ++sum;
35 }
36 printf("%d\n",sum);
37 }
38 return 0;
39 }

posted on 2011-07-03 10:23  pcoda  阅读(302)  评论(0编辑  收藏  举报