回溯法解决装载问题

8 篇文章 0 订阅


/********************************************************************
 *    MAIN.CPP    文件注释
 *    文件路径:    D:\EVERBOX\SOURCE CODE\贪心法\装载问题/
 *    作者    :    杨帆 江南大学 计科0905
 *    创建时间:    2011/12/4 20:24
 *    文件描述:    
 *********************************************************************/
#include <iostream>
using namespace std;

typedef int* pINT;
template<class Type>
class Loading{
public:
	friend Type MaxLoading(Type* w,int num ,Type C1,int* bestx );
	friend void SolveLoading(int C2,bool* x,int* w,int num);

	void Backtrack(int i);

	int num;/* 集装箱数目 */
	int * x;/* 当前解 */
	int * bestx;/* 当前最优解 */

	Type* w;/* 集装箱重量数组 */
	Type  C1;/* 第一艘船的容量 */
	Type cw;
	Type bestw;
	Type r;/* 剩余集装箱重量 */
};

template<class Type>
void Loading<Type>::Backtrack( int i )
{
	if( i > num){
		if ( cw > bestw ) {
			for (int i = 1; i <= num ; i++ ) {
				bestx[i] = x[i];
				bestw = cw;				
			}
		}
		return ;
	}
	r -= w[i];
	if ( cw+w[i] <= C1 ) {
		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 Type>
 Type   MaxLoading( Type* w,int num ,Type C1,int* bestx )
{
	Loading<Type> X;
	X.x = new int[num+1];
	X.w = w;
	X.C1= C1;
	X.num = num;
	X.bestx = bestx;
	X.bestw = 0;
	X.cw = 0;
	X.r = 0;
	for (int i = 1; i <= num ; i++ ) {
		X.r += w[i];
	}
	X.Backtrack(1);
	delete[] X.x;
	return X.bestw;

}
template<class Type>
 void    SolveLoading( int C2,int* x,Type* w,int num )
 {
	 int totalW = 0;
	 int c1W = 0;/* 第一艘船总载重 */
	 for (int i = 1; i <= num ; i++ ) {
		 if ( x[i] == 1 ) {
			 c1W += w[i];
		 } 
		 totalW += w[i];
	 }
	 if ( totalW-c1W > C2 ) {
		 printf("没有合理的装载方案! :( ");
		 return;
	 }

	 printf(" 装载方案如下:\n ");
	 printf(" 第一艘船装 ");
	 for (int i = 1; i <= num ; i++ ) {
		 if ( x[i] == 1 ) {
			 printf("%d ",i);
		 } 
	 }
	 printf("\n总载重 %d \n",c1W);


	 printf(" 第二艘船装 ");
	 for (int i = 1; i <= num ; i++ ) {
		 if ( ! x[i] ) {
			 printf("%d ",i);
		 } 
	 }
	 printf("\n总载重 %d \n",totalW-c1W);

}

int main(int argc,char* argv[]){

	int C1 = 0;
	int C2 = 0;
	int num = 0;
	int* x = NULL;
	int** m = NULL;
	int* w = NULL;

	printf("输入第一艘船最大载重量:");
	scanf("%d",&C1);

	printf("输入第二艘船最大载重量:");
	scanf("%d",&C2);


	printf("输入货物个数");
	scanf("%d",&num);

	x = new int[num+1];
	w = new int[num+1];
	m = new pINT[num+1];
	for (int i = 0; i < num+1 ; i++ ) {
		m[i] = new int[num+1];
	}


	printf("分别输入货物重量(回车结束):\n");

	for (int i = 1; i <= num ; i++ ) {
		scanf("%d",w+i);
	}



	MaxLoading(  w, num, C1, x );

	SolveLoading(C2, x, w, num);

	delete[] x;
	delete[] w;
	delete[] m;
	
	return 0;
}






  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值