回溯法-装载问题

子集树问题

和 子集树的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;
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值