poj1017
一、题意:有底面积为1*1,2*2,...,6*6高为h的物品若干,求用最少的包装盒包装好这些物品,其中包装盒的大小固定为底面积6*6,高为h
二、思路:贪心。先放大的,然后用小的尽量去凑满这个包装盒,从6到1类推。我用的是比较暴力的方法,每一种情况都考虑出来,然后模拟。
三、代码:
#include"iostream" #include"stdio.h" #include"math.h" using namespace std; int num[7]; int Solve() { int res=num[5]; res+=num[4]; num[0]-=num[4]*11; res+=num[3]; if(num[1]<num[3]*5) { num[0]-=(20*num[3]-4*num[1]); } num[1]-=num[3]*5; res+=num[2]/4; int numLeave=num[2]%4; if(numLeave>0) res++; switch(numLeave) { case 1: if(num[1]<5) { if(num[1]>0) { num[0]-=(27-num[1]*4); num[1]=0; } else num[0]-=27; } else { num[1]-=5; num[0]-=7; } break; case 2: if(num[1]<3) { if(num[1]>0) { num[1]=0; num[0]-=(18-num[1]*4); } else num[0]-=18; } else { num[1]-=3; num[0]-=6; } break; case 3: if(num[1]<1) { num[0]-=9; } else { num[1]-=1; num[0]-=5; } break; default: break; } if(num[1]>0) { res+=num[1]/9; if(num[1]%9>0) { res++; num[0]-=(36-4*(num[1]%9)); } } if(num[0]>0) { res+=ceil(num[0]/36.0); } return res; } int main() { while(true) { int sum=0; for(int i=0;i<6;i++) { cin>>num[i]; sum+=num[i]; } if(!sum) break; cout<<Solve()<<endl; } return 0; }