装载问题 回溯算法

         题目描述:有一批共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;
}

         参考资料:《计算机算法设计与分析 第三版》   王晓东

    原文作者:回溯法
    原文地址: https://blog.csdn.net/NeilHappy/article/details/7299689
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞