题目描述:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi。装载问题要求确定,是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。
—–题目出自《计算机算法设计与分析 第三版》 王晓东
这是一个典型的回溯算法问题。代码如下:
template <class T>
class Loading
{
private:
int n;// The numbers
int *x;//record the path
int *bestx;//record the best path
T *w;//The weight array
T c;//The first box's weight
T cw;//current weight
T bestw;//The best weight
T r;//The rest weight
public :
void backtrack(int i);
T friend MaxLoading(T w[],T c,int n,int bestx[]);
};
template <class T>
void Loading<T>::backtrack(int i)
{
if(i>n)
{
bestw=cw;
for(int j=1;j<=n;j++)
bestx[j]=x[j];
}
else
{
r-=w[i];
if(cw+w[i]<=c)
{
x[i]=1;
cw+=w[i];
backtrack(i+1);
cw-=w[i];
}
if(cw+r>=bestw)
{
x[i]=0;
backtrack(i+1);
}
r+=w[i];
}
}
template <class T>
T MaxLoading(T w[],T c,int n,int bestx[])
{
Loading<T> x;
x.x=new int[n+1];
x.bestx=bestx;
x.w=w;
x.c=c;
x.n=n;
x.cw=0;
x.bestw=0;
x.r=0;
for(int i=0;i<n;i++)
x.r+=w[i];
x.backtrack(1);
delete [] x.x
return x.bestw;
}
参考资料:《计算机算法设计与分析 第三版》 王晓东