poj1017 Packets

参考了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 }
原文地址:https://www.cnblogs.com/wangyiming/p/6589746.html