5-2装载问题(回溯)
//5-1装载问题 回溯
/*
两艘船的载重量是8 7
三个集装箱的重量是3 7 5
2
8 7
3
3 7 5
*/
#include<iostream>
using namespace std;
int x[100];//记录路径信息的
int w[100]; //集装箱的重量
int c[100]; //c[i]表示第i艘船的重量为c[i]
int m;//m艘船
int n;//n个集装箱
int bestw;//当前最优载重量
int r;//r剩余没装的总重量 ,r的初值为全部集装箱重量之和
int cw;//当前载重量
void Output(){
for(int i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
}
void Init(int c){//初始化
bestw=0;//当前最优载重量
for(int i=1;i<=n;i++){//r剩余没装的总重量 ,r的初值为全部集装箱重量之和
r+=w[i];
x[i]=0;
}
cw=0;//当前载重量
}
void Backtrack(int i,int c){
if(i>n){ //到达叶节点
if(cw>bestw) bestw=cw;
Output(); //输出
cout<<"bestw="<<bestw<<endl;
return ;
}
//搜索子树
r-=w[i];
if(cw+w[i]<=c){//搜索左子树
x[i]=1;
cw += w[i];
Backtrack(i+1,c);
cw -= w[i];
}
if(cw+r>bestw){ //搜索右子树
x[i]=0;
Backtrack(i+1,c);
}
r += w[i];
}
int main(){
cin>>m;
for(int i=1;i<=m;i++)
cin>>c[i];
cin>>n;
for(int i=1;i<=n;i++)
cin>>w[i];
Init(c[1]);
Backtrack(1,c[1]);
return 0;
}