作为一个非计算机专业的上班族兼C业余爱好者,哥煞费苦心的写了这个恶心的程序,貌似运行还是可以得到正确结果滴,求鉴定……
//某个工厂生产出的产品都要被打包放入正四棱柱的盒子内。所有盒子的高
//度都为h,但底面的尺寸不同,可以为1*1,2*2,3*3,4*4,5*5,或6*6。
//这些盒子将被放入高度为h,底面尺寸为6*6的箱子里,送到消费者手中。
//为了降低运送成本,工厂希望尽量减少箱子 数量。如果有一个好的算法,
//能使箱子的数量降到最低,这将给工厂节约不少资金。请你写一个这样的程序。
#include<stdio.h>
int main()
{
int box[6];
int i=0; //定义数组用于存放箱子个数;
int m_r=0;
int result=0; //变量m_r用于存放中间结果,result用于存放最后结果;
printf("分别输入每个箱子的个数:\n"); //输入箱子个数;
for(;i<6;i++)
{
scanf("%d",&box[i]);
}
m_r=box[5]+box[4]+box[3]+box[2]/4; //6*6、5*5、4*4每个分别要占用一个箱子,3*3每4个占用一个箱子;
box[0]=box[0]-box[4]*11; //按最优方案,每个5*5的箱子可以附带11个1*1的箱子;
box[1]=box[1]-box[3]*5; //每个4*4的箱子可以附带5个2*2的箱子;
box[2]=box[2]%4;
//初步装箱结束,剩下的是最优方案之外的再次组合;
//先考虑此时已经没有剩下箱子的情况,此时m_r就是最终结果;
if((box[0]<=0)&&(box[1]<=0)&&(box[2]<=0))
{
result=m_r;
}
//再考虑只剩下3*3的箱子的情况;
else if((box[0]<=0)&&(box[1]<=0)&&(box[2]>0))
{
result=m_r+1;
}
//只剩下3*3和2*2的箱子的情况;
else if((box[0]<=0)&&(box[1]>0)&&(box[2]>0))
{
if(box[2]==1) //3*3剩下一个;
{
if(box[1]<=4) //每个3*3的箱子可以附带4个2*2的箱子
{
result=m_r+1;
}
else
{
box[1]=box[1]-4;
result=m_r+1+box[1]/9+1; //2*2的箱子每9个可以装满一个大箱子;
}
}
if(box[2]==2) //3*3剩下两个;
{
if(box[1]<=3) //每两个3*3的箱子可以附带3个2*2的箱子;
{
result=m_r+1;
}
else
{
box[1]=box[1]-3;
result=m_r+1+box[1]/9+1;
}
}
if(box[2]==3) //3*3剩下三个;
{
if(box[1]<=1) //每三个3*3的箱子可以附带一个2*2的箱子;
{
result=m_r+1;
}
else
{
box[1]--;
result=m_r+1+box[1]/9+1;
}
}
}
//只剩下3*3和1*1的箱子的情况;
else if((box[0]>0)&&(box[1]<=0)&&(box[2]>0))
{
if(box[2]==1)
{
if(box[0]<=27) //每个3*3的箱子可以附带27个1*1的箱子;
{
result=m_r+1;
}
else
{
box[0]=box[0]-27;
result=m_r+1+box[0]/36+1; //每36个1*1的箱子可以装满一个大箱子;
}
}
if(box[2]==2)
{
if(box[0]<=18) //每两个3*3的箱子可以附带18个1*1的箱子;
{
result=m_r+1;
}
else
{
box[0]=box[0]-18;
result=m_r+1+box[0]/36+1;
}
}
if(box[2]==3)
{
if(box[0]<=9)
{
result=m_r+1;
}
else
{
box[0]=box[0]-9;
result=m_r+1+box[0]/36+1;
}
}
}
//上述步骤虽然代码繁琐,但是其实很容易想,也容易写出来;
//******************************************************
//再考虑1*1、2*2、3*3都有剩余的情况,也是最复杂的情况……
else if((box[0]>0)&&(box[1]>0)&&(box[2]>0)) //不过,依然还是优先尽可能地装2*2的箱子;
{
if(box[2]==1) //依然先考虑3*3只有一个的情况;
{
if(box[1]<=4)
{
box[0]=box[0]-(36-9-4*box[1]);
m_r++;
(box[0]>0)?box[0]:0;
result=m_r+box[0]/36+1;
}
else
{
box[1]=box[1]-4;
m_r++;
box[0]=box[0]-(36-4*(box[1]%9));
(box[0]>0)?box[0]:0;
result=m_r+box[1]/9+box[0]/36+1;
}
}
if(box[2]==2)
{
if(box[1]<=3)
{
box[0]=box[0]-(36-18-4*box[1]);
m_r++;
(box[0]>0)?box[0]:0;
result=m_r+box[0]/36+1;
}
else
{
box[1]=box[1]-3;
m_r++;
box[0]=box[0]-(36-4*(box[1]%9));
(box[0]>0)?box[0]:0;
result=m_r+box[1]/9+box[0]/36+1;
}
}
if(box[2]==3)
{
box[1]--;
m_r++;
box[0]=box[0]-5;
box[0]=box[0]-(36-4*(box[1]%9));
(box[0]>0)?box[0]:0;
result=m_r+box[1]/9+box[0]/36+1;
}
}
else //只有1*1和2*2的情况,直接按面积计算即可;
{
box[0]=box[0]-(36-4*(box[1]%9));
(box[0]>0)?box[0]:0;
result=m_r+box[1]/9+box[0]/36+1;
}
printf("the result is %d\n",result);
return(0);
}
中间逗号表达式是为了避免出现负数而特地加上去的……