回溯法-装载问题

子集树问题

和 子集树的0-1背包问题类似,但是没有考虑价格

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

//第五章装载问题
template<class Type>
class Loading{
    friend Type MaxLoading(Type [],Type,int,int[]);
   // private:
   public:
        void Backtrack(int i);
        int n,      //集装箱数
        *x,         //当前解
        *bestx;     //当前最优解


        Type *w,    //集装箱重量数组
        c,          //货轮载重量
        cw,         //当前载重量
        bestw,       //当前最优载重量
        r;             //剩余集装箱重量

};

template <class Type>
void Loading<Type>::Backtrack(int i){
//搜索第i层节点

if(i>n){//到达叶节点
 if(cw>bestw){ for(int j=1;j<=n;j++)bestx[j]=x[j];bestw=cw;    }
 return;
}

//搜索子树
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 Type>
Type MaxLoading (Type w[],Type c,int n,int bestx[])
{
    //迭代回溯法
    //返回最优载重量及相应解
    Loading <Type> X;
    //初始化x
    X.x=new int[n+1];
    X.w=w;
    X.c=c;
    X.n=n;
    X.bestx=bestx;
       X.bestw=0;
       X.cw=0;
       X.r=0;
       for(int i=1;i<=n;i++){
       X.r+=w[i];
       }


    //计算最优载重量
    X.Backtrack(1);
    delete []X.x;
    return X.bestw;
}






int main()
{
   int n=3;
   int n;
   int m;
   int bestx[4];
   int w[4]={0,10,40,40};
   int c=50 ;


   m=MaxLoading(w,c,n,bestx);
   for(int i=1;i<=n;i++){
   cout<<bestx[i]<<" ";
   }
    return 0;
}

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