装箱子问题:产品为长方形,高度都是h,长和宽相同,有6种型号:6*6,5*5,4*4,3*3,2*2,1*1,包裹是6*6*h的长方体,求最少的包裹数
输入数据:
0 0 4 0 0 1
输出数据:
2
分析:
- 该大小的包裹一个只能装1个6*6的或者1个5*5的或者1个4*4的或者最多4个3*3的,上述4种产品不能放在同一个包裹中,N为使用包裹数,从a到f代表1-6种产品的数目;根据上一步分析,有N=f+e+d+(c+3)/4,(c+3)/4是一个向上取正的操作。
- 接下来使用N个包裹时剩余的能装入2*2产品的数目,1个4*4的包裹中可以有5个装2*2产品的地方,装3*3产品的包裹会有不同的情况:
- 装一个3*3,有5个装2*2产品的地方 装2个3*3,有3个装2*2产品的地方 装3个3*3,有1个装2*2产品的地方,据此建立一个数组装c%4的数值。有 剩余能装2*2产品的地方(用y代表):y=5 *d+u[c%4]。然后需要和b比较,如若b〉y,则需要更新N,N+=(b-y+8)/9
- 最后是1*1的产品,剩余1*1的位置以x代表 x=36*N-36*f-25*e-16*d-9*c-4*b,x和a比较,若x>a,则更新N,N+=(a-x+35)/36
#include<stdio.h> void main() { int N,a,b,c,d,e,f,y,x; int u4[4]={0,5,3,1}; while(1) { scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f); N=f+e+d+(c+3)/4; y=5 * d + u4[c % 4]; if( y < b ) N+=( b - y+8 ) / 9; x=36 * N-36 * f-25 * e-16 * d-9 * c - 4 * b; if(x<a) N+=(a-x+35)/36; printf("%d",N); } }