1226:装箱问题(有很多的数字技巧!)

【题目描述】
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1×1,2×2,3×3,4×4,5×5,6×6。这些产品通常使用一个6×6×h的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。

【输入】
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1×1至6×6这六种产品的数量。输入文件将以6个0组成的一行结尾。

【输出】
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

【输入样例】
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
【输出样例】
2
1

看一下 其他博主的思路!
原文链接:https://blog.csdn.net/zqhf123/article/details/104254143
思路:
一、首先装6×6的,每个6×6的装一个箱子刚好。
二、然后装5×5的,每个5×5的需要一个箱子,箱子里多余的空间装1×1的,可以每个箱子装11个。
三、然后装4×4的,每个4×4的需要一个箱子。箱子里多余的空间可以装2×2,也可以装1×1。先装2×2,每个箱子最后可以装5个2×2,当2×2不够时,再考虑装1×1的。每个箱子最多装20个1×1。
四、然后装3×3的。每个箱子可以装4个3×3的。剩下的3×3又分3种情形:
1)剩1个3×3,要装一个箱子,剩余27格空间。最多可以装5个2×2和7个1×1;
2)剩2个3×3,要装一个箱子,剩余18格空间。最多可以装3个2×2和6个1×1;
3)剩3个3×3,要装一个箱子,剩余9格空间,最多可以装1个2×2和5个1×1;
然后装2×2的,每个箱子可以装9个2×2的。剩下的用1×1的装。
最后考虑装1×1的,每个箱子可以装36个1×1,如果还有多余的,则增加一个箱子装。
在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	int a, b, c, d, e, f, g, h, n;
	int k[4] = { 0,5,3,1 };
	while (cin >> a >> b >> c >> d >> e >> f)
	{
		if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0) break;
		n = d + e + f + (c + 3) / 4;//一个3*3的占一盒,两个,三个四个都占一盒!
		h = 5 * d + k[c % 4];//装4*4和3*3的箱子   能装下2*2的数
		if (b > h)
			n = n + (b - h + 8)/9;//+8是向上取整!
		g = 36 * n - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;//总面积减去用过的面积  剩下的是1*1的 面积  即 个数!
		if (a > g)
			n = n + (a - g + 35) / 36;
		cout << n << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值