A

Problem Description

一个工厂生产的产品形状都是长方体,高度都是h,主要有1*1,2*2,3*3,4*4,5*5,6*6等6种。这些产品在邮寄时被包装在一个6*6*h的长方体包裹中。由于邮费很贵,工厂希望减小每个订单的包裹数量以增加他们的利润。因此他们需要一个好的程序帮他们解决这个问题。你的任务就是设计这个程序。

Input

输入包括多组测试数据,每一行代表一个订单。每个订单里的一行包括六个整数,用空格隔开,从小到大分别为这6种产品的数量。6个0表示文件结束。

Output

针对每个订单输出一个整数,占一行,代表对应的订单所需的最小包裹数。没有多余的空行。

Sample Input

0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0

Sample Output

2
1

#include <iostream>
#include <math.h>

using namespace std;

int main(int argc, const char * argv[])
{
    int boxA,boxB,boxC,boxD,boxE,boxF;//不同底面积箱子数量
    int left2x2,left1x1;
    int countBox;//使用大箱子数量
    
    while(cin>>boxA>>boxB>>boxC>>boxD>>boxE>>boxF)
    {
        //结束条件
        if (boxA == 0 && boxB == 0 && boxC == 0 && boxD == 0 && boxE == 0 && boxF == 0)
        {
            break;
        }
        //体积为4、5、6的有一个就需要一个箱子,体积为3的需要boxC / 4个箱子
        countBox = boxD + boxF + boxE + (boxC + 3) / 4;
        
        //剩余的空间我们采取贪心的策略,先放2 * 2的箱子,4 * 4的箱子还剩下boxD * 5个2 * 2的空间
        left2x2 = boxD * 5;
        
        //对于3 * 3底面积的需要分情况讨论
        if (boxC % 4 == 3) //3 * 3的箱子装完了还剩下3个,只留下了1个2 * 2的空间
        {
            left2x2 += 1;
        }
        else if (boxC % 4 == 2) //这种情况下留下了3个2 * 2的空间
        {
            left2x2 += 3;
        }
        else if (boxC % 4 == 1) //注意哦,这种情况下最多可以留下5个2 * 2的空间哈
        {
            left2x2 += 5;
        }
        
        if (left2x2 < boxB)
        {
            countBox += (((boxB - left2x2) + 8) / 9);  //2 * 2箱子没地方的,开新箱子。
        }
        //解决了2 * 2的空间还剩下1 * 1的,总体积减去所有其他箱子的体积,就剩下1 * 1的空间了。
        left1x1 = 36 * countBox - 36 * boxF - 25 * boxE - 16 * boxD - 9 * boxC - 4 * boxB;
        if  (left1x1 < boxA)//空间不够,加大箱子
        {
            countBox += (((boxA - left1x1) + 35) / 36);
        }
        cout
原文地址:https://www.cnblogs.com/yangf428/p/10028520.html