回溯法解决装载问题

来源:互联网 发布:被男友强啪的经验知乎 编辑:程序博客网 时间:2024/05/23 19:18


/******************************************************************** *    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;}