【说明】
设有n个货物要装入若干个容量为C的集装箱以便运输,这n个货物的体积分别为{S1,S2,...,Sn},且有si≤C(1≤i≤ n)。为节省运输成本,用尽可能少的集装箱来装运这n个货物。
下面分别采用最先适宜策略和最优适宜策略来求解该问题。
最先适宜策略( firstfit)首先将所有的集装箱初始化为空,对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱中。
最优适宜策略( bestfit)与最先适宜策略类似,不同的是,总是把货物装到能容纳它且目前剩余容量最小的集装箱,使得该箱子装入货物后闲置空间最小。
详细代码(全)
#include<iostream.h>
#include <malloc.h>
void firstfit(int n,int C,int *p)
{
int i,j;
int k=0;
int *q;
q =(int *)malloc(sizeof(int) * n);
for(i=0;i<n;i++)
{
q[i]=0;
}
for(i=0;i<n;i++)
{
j=0;
while(C-q[j]<p[i])
{
j++;
}
q[j]=q[j]+p[i];
k=k>(j+1)?k:(j+1);
}
cout<<"需要集装箱:"<<k<<endl;
free(q);
}
void bestfit(int n,int C,int *p)
{
int i,j,min,m,temp;
int *q;
q =(int *)malloc(sizeof(int) * n);
int k=0;
for(i=0;i<n;i++)
{
q[i]=0;
}
for(i=0;i<n;i++)
{
min=C;
m=k+1;
for(j=0;j<k+1;j++)
{
temp=C-q[j]-p[i];
if(temp>=0&&temp<min)
{
min=temp;
m=j;
}
}
q[m]=p[i]+q[m];
k=k>(m+1)?k:(m+1);
}
cout<<"需要集装箱:"<<k<<endl;
free(q);
}
void main()
{
int n;
int C;
int *p=0;
cout<<"请输入集装箱容量:"<<endl;
cin>>C;
cout<<"请输入货物数:"<<endl;
cin>>n;
p =(int *)malloc(sizeof(int) * n);
cout<<"请输入件货物的体积:"<<endl;
for(int i=0;i<n;i++)
{
cin>>p[i];
}
cout<<endl;
int a;
while(a!=0)
{
cout<<endl<<"请选择:\n"<<"0.退出\n"<<"1.最先适宜策略\n"<<"2.最优适宜策略\n";
cin>>a;
if(a==1)
{
firstfit(n,C,p);
}
else if(a==2)
{
bestfit(n,C,p);
}
else if(a==0)
{
a=0;
free(p);
}
else
{
cout<<"输入错误!\n";
}
}
}