参考了http://www.cnblogs.com/mycapple/archive/2012/08/23/2652070.html
思路:
贪心。
实现:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 int main() 6 { 7 int b1, b2, b3, b4, b5, b6; //不同大小的木块个数 8 int nTotal = 0; //最少需要的箱子数目 9 int c1; //当前能放 1*1 木块的空格数目 10 int c2; //当前能放 2*2 木块的空格数目 11 int Contain2[4] = { 0, 5, 3, 1 }; //记录被3*3的占用之后,还剩多少给2*2的使用 12 while (cin >> b1 >> b2 >> b3 >> b4 >> b5 >> b6, b1 || b2 || b3 || b4 || b5 || b6) 13 { 14 nTotal = b6 + b5 + b4 + (b3 + 3) / 4; //只能装1个6*6的,1个5*5的,1个4*4的, 15 //而3*3的需要多情况考虑,3*3的需要向上调整 16 //这里有一个小技巧 (b3+3)/4 17 //正好等于b3除以4向上取整的结果,下同 18 c2 = 5 * b4 + Contain2[b3 % 4]; //放2*2的数目等于放一个4*4时需要5个2*2加上 19 //放1到4个3*3时各需要的数目 ,即还可以装多少个2*2的 20 if (b2 > c2) 21 nTotal += (b2 - c2 + 8) / 9; //向上调整 ,总的2*2的个数减去装过的2*2的个数, 22 //得到剩余的2*2的个数, 23 //此个数加上8然后除以9就正好等于它除以9向上取整的结果, 24 //之所以总数要加上这个数是由于若单独装2*2,可以装9个 25 c1 = 36 * nTotal - 36 * b6 - 25 * b5 - 16 * b4 - 9 * b3 - 4 * b2; //还可以装多少个1*1的 26 if (b1 > c1) 27 nTotal += (b1 - c1 + 35) / 36; //向上调整,总的1*1的个数减去装过的1*1的个数, 28 //得到剩余的1*1的个数, 29 //此个数加上35然后除以36就正好等于它除以36向上取整的结果 30 //之所以总数要加上这个数是由于若单独装1*1,可以装36个 31 cout << nTotal << endl; 32 } 33 return 0; 34 }