///贪心,先装大的箱子,后装小的箱子,在6*6中我是用剩余面积表示是否还能再装入箱子,装6,5,4,都不会 ///有什么问题,但是装3*3时会对结果有影响,因此轮到装3*3时要特别考虑对2*2的影响,当然对1*1没 ///多少影响 #include<stdio.h> int packets[7]; int main() { while(1) { int i,end=0; for(i=1;i<7;i++) { scanf("%d",&packets[i]); if(!packets[i]) end++; } if(end==6) break; ///t用来检测已经装了几个3*3的箱子 ,area表示剩余面积,size表示当前所能装的最大尺度 int num=0,size,t,area,max2;///num表示需要的箱子数目 while(1) { end=0;size=6;num++;area=36;t=0; for(i=6;i>=1;i--) { if(!packets[i]) { end++; continue; } else { if(i>size) continue; else { while(packets[i]>0&&i<=size&&area>0) { ///修改当前能装入的箱子的尺寸大小 if(i==6&&6-i<size) size=0; else if(i==5&&1<size) size=1; else if(i==4&&2<size) size=2; else if(i==3&&3<size) size=3; else if(i==2&&4<size) size==4; else { if(i==1&&5<size) size=5; } ///检测装了几只3*3的箱子 if(i==3) t++; ///显示出当装了t只3*3箱子,最多还可以装多少2*2的箱子即max2 if(i==3) { if(t==1) max2=5; else if(t==2) max2=3; else if(t==3) max2=1; else if(t==4) max2==0; else ; } if(i==2&&t!=0) { if(max2>0) { packets[i]--; area-=i*i; max2--; } else break; } else { packets[i]--; area-=i*i; } } } } } if(end==6) break; } printf("%d/n",num-1);因最后检测能退出循环时也对num++,所以需要减一 } return 0; }