装箱问题
问题描述
一个工厂制造的产品形状都是长方体,它们的高度都是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
确定好贪心策略,模拟就好了,网上的思路
#include<iostream>
using namespace std;
int num_2[] = {0,5,3,1};
int num_1[] = {0,7,6,5};
int main()
{
int a[7],ans,flag;
while(1)
{
flag=1;
ans=0;
for(int i=1;i<=6;i++)
{
cin>>a[i];
if(a[i]!=0)flag=0;
}
if(flag)break;
ans=a[6]+a[5]+a[4]+(a[3]+3)/4;//4 5 6 尺寸的每个都要新开箱子
/*将新开的箱子尽量填满*/
int a2 = a[4]*5 + num_2[a[3]%4];//尽量填满3 4 所需要2箱子的个数
int a1 = a[5]*11 + num_1[a[3]%4];//填完2填1
if(a[2]>a2)//有剩余新开箱子
{
ans+=(a[2]-a2+8)/9;//9 个2*2箱子可以填满一个6*6箱子,不足9个算一个
a1+= 36-((a[2]-a2)%9)*4;//将新开的箱子用1*1填
}
else //没有或者不够:2 不用新开箱子,不够的用1来填
{
a1+=(a2-a[2])*4;
}
if(a[1]>a1)
ans+=(a[1]-a1+35)/36;//除以36 向上取整,不足36个也新开一个
cout<<ans<<endl;
}
}