POJ 1017 装箱问题(简单贪心)

POJ 1017—装箱问题

装箱问题是…一种很常见的问题。通常描述如下,有编号为1,2,3,4,5…N的N种物品,体积分别为V1,V2…VN。将这N种物品装到容量都为S的箱子里(箱子容量也可能不同)。约定往这种箱子里装进去的物品总体积不能超过S,求最少要几个这种箱子。

问题描述:

一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为11, 22, 33, 44, 55, 66。这些产品通常使用一个 66h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。输入输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为11至66这六种产品的数量。输入文件将以6个0组成的一行结尾。输出除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

样例输入

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

样例输出

2
1

解决思路:

简单分析一下,即可得出一下结论,此时我们只需要依次从大到小往箱子中填充物品即可:
在这里插入图片描述较简单的贪心问题,分析清楚即可解决。

实现代码:

#include<stdio.h>
#include<math.h>
int main()
{
	int a,b,c,d,e,f;
	while(scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f)!=EOF)
	{
		int sum=0,n=0,m=0;//sum总箱子数,n余下放1x1的位置,m余下放2x2的位置
		if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)return 0;
		sum+=d+e+f+((c+3)/4);
		if(c%4==1){m+=5;n+=7;}
		if(c%4==2){n+=6;m+=3;}
		if(c%4==3){m+=1;n+=5;}
		m+=5*d;
		if(m<b)sum+=(ceil)((b-m)*1.0/9);//ceil向上取整
		n=36*sum-36*f-25*e-16*d-9*c-4*b;
		if(n<a)sum+=(ceil)((a-n)*1.0/36);//向上取整
		printf("%d\n",sum);
	}
	return 0;
}
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值