装载问题 回溯算法

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值