poj_1017_Packets

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  }

你可能感兴趣的:(poj)