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;
}