POJ--1017 装箱问题(贪心)

地址:POJ1017

大意是只有6*6规格的箱子来装(虽然是描述三维的,但因为高度相同,因此忽略掉),给你若干个从1*1到6*6规格的箱子,求所需最小箱子数。

 

思路:很明显应该利用贪心,即优先从最大规格的箱子数来考虑,然后因为在装完较大规格的箱子后,该箱子可以存在剩余空间,所以仍应该利用,且仍旧优先装较小规格中较大的箱子。6规格的箱子只能装一个且空间全占满,无剩余;5规格的箱子装一个,且还可以装11个1*1规格的箱子;4*4的装一个后可以最多装从5个2*2规格到20个1*1规格的箱子。

关于3*3规格箱子的处理,一个箱子可以装4到1个该规格箱子,但剩下的空间应该我们分情况讨论。在纸上画一下可得知当该箱子分别装4,3,2,1个3*3规格后,剩余空间最多可以装0,1,3,5个2*2规格的箱子。

剩下的2*2和1*1箱子就首先放进前面各较大规格箱子空间的剩余,不够的话再用新箱子。

代码如下:

 

#include<iostream>
using namespace std;


int main() {
	int a, b, c, d, e, f, x, y;//x,y分别为给规格1,2的箱子剩余的空间
	int sum;//所需的箱子数量

	while (true) {
		cin >> a >> b >> c >> d >> e >> f;
		if (a + b + c + d + e + f == 0) {
			break;
		}

		sum = f + d + e + (c + 3) / 4;

		y = d * 5;//因为装规格为5的箱子还能最多装5个规格为2的箱子

		//判断规格为3的箱子数
		if (c % 4 == 3) {
			y += 1;
		}
		else if (c % 4 == 2) {
			y += 3;
		}
		else if (c % 4 == 1) {
			y += 5;
		}

		//如果1*1和2*2的仍没有装完
		if (y < b) {
			sum += ((b - y) + 8) / 9;
		}

		x = 36 * sum - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;
		if (x < a) {
			sum += ((a - x) + 35) / 36;
		}

		cout << sum << endl;
	}

	return 0;
}

另外这道题因为需要将箱子都装进,所以在计算数量是要上取整,因此我们可以用比如当x/y时,将原式变为(x+y-1)/y即可。

除此之外,在最后还应该注意1*1规格箱子与其剩余空间的计算问题。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值