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