这题是道贪心题,可以一步一步模拟的,不过需要点耐心和细心。
(思路就不写了,看到别人的写的挺好的,想了解的请参考:優YoU http://blog.csdn.net/lyy289065406/article/details/6674366 )
题目链接:http://poj.org/problem?id=1017
以下是我写的代码:
#include<stdio.h> int main() { int s,a[7],m=0,i; for (i=1;i<=6;i++) { scanf("%d",&a[i]); m+=a[i]; } while (m>0) { s=a[6]+a[5]+a[4]; a[1]=a[1]-a[5]*11; a[2]=a[2]-a[4]*5; if (a[2]<=0) a[1]=a[1]+a[2]*4; s=s+a[3]/4; a[3]%=4; if (a[3]>0) { s++; if (a[2]>0) { if (a[3]==1) { if (a[2]>5) { a[2]-=5; a[1]-=7; } else { a[1]=a[1]-(27-a[2]*4);a[2]=0; } } else if (a[3]==2) { if (a[2]>3) { a[2]-=3; a[1]-=6; } else { a[1]=a[1]-(18-a[2]*4); a[2]=0; } } else if (a[3]==3) { if (a[2]>1) { a[2]-=1; a[1]-=5; } else { a[1]=a[1]-(9-a[2]*4);a[2]=0; } } } else a[1]=a[1]-(36-a[3]*9); } if (a[2]>0) { s+=a[2]/9; a[2]%=9; if (a[2]>0) s++; a[1]=a[1]-(36-a[2]*4); } if (a[1]>0) { s+=a[1]/36; if (a[1]%36>0) s++; } printf("%d\n",s); m=0; for (i=1;i<=6;i++) { scanf("%d",&a[i]); m+=a[i]; } } return 0; }
万里晴空 - 博客频道 - CSDN.NET
以下代码参考 万里晴空 - 博客频道 - CSDN.NET
#include <stdio.h> int main() { int N, a, b, c, d, e, f, y, x; int u[4]={0, 5, 3, 1}; while(1) { scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f); if (a+b+c+d+e+f==0) break; N = f + e + d + (c + 3) / 4; //先将6*6,5*5,4*4,3*3的包好 y = 5 * d + u[c % 4]; //y表示已经使用的N个箱子至多可容纳多少个2*2的包裹 if(b > y) N += (b - y + 8 ) / 9; //如果那N个箱子装不完2*2的包裹,再另外使用新的箱子 x = 36 * N - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b; //表示当前已经使用的N个箱子至多可容纳多少个1*1的包裹 if(a > x) N += ( a - x + 35 ) / 36; //装不完再用新的箱子 printf("%d\n", N); } return 0; }
后者是先给不能用于填充的开辟空箱6*6,5*5,4*5,3*3,
然后,看看已开辟的箱能够容纳多少用于填充的包裹,判断是否需要开辟新箱。