#include <iostream>
using namespace std;
//定义全局变量
int x[100]; //表示当前解,0代不表放,1代表放
int bestx[100];//表示最优解
int w[100];// 表示集装箱i的重量
int bestw;//当前最优装载重量
int r;//剩余集装箱的重量
int n; //集装箱的数量
int c1;//轮船1的载重量
int c2;//轮船2的载重量
int cw;//当前轮船1的载重量
void ShuRu()
{
cout<<"请输入集装箱的数量:"<<endl;
cin>>n;
cout<<"请输入轮船1,2的载重量:"<<endl;
cin>>c1>>c2;
cout<<"请输入每个集装箱的重量:"<<endl;
for(int i=1;i<=n;i++)
{
cin>>w[i];
}
}
void ChushiH ()
{
r=0;
cw=0;
bestw=0;
for(int i=1;i<=n;i++)
{
r=r+w[i];
}
}
void HuiSu (int i)
{
if(i>n) //判断是否达到叶子节点
{
if(cw>bestw)
{
for(int j=1;j<=n;j++)
{
bestx[j]=x[j];
}
bestw=cw;
}
}
r=r-w[i];
if(cw+w[i]<=c1) //判断该集装箱到底放不放
{
x[i]=1;
cw=cw+w[i];
HuiSu(i+1);
//当节点i的子树延伸结束时要返回i节点
x[i]=0;
cw=cw-w[i];
}
if(cw+r>bestw) //判断先不放该集装箱后是否还有可行解
{
x[i]=0;
HuiSu(i+1);
}
r=r+w[i];//当节点i的子树延伸结束时要返回i节点
}
void ShuChu ()
{
int c2w=0;
for(int i=1;i<=n;i++)
{
if(bestx[i]==0)
{
c2w=c2w+w[i];
}
}
if(c2w>c2)
cout<<"装不下啊!"<<endl;
else
{
cout<<"轮船1装入的集装箱为:";
for(int i=1;i<=n;i++)
{
if(bestx[i]==1)
cout<<i<<" ";
}
cout<<endl;
cout<<"轮船2装入的集装箱为:";
for(int i=1;i<=n;i++)
{
if(bestx[i]!=1)
cout<<i<<" ";
}
}
}
int main()
{
ShuRu();
ChushiH();
HuiSu(1);
ShuChu();
}
装载问题回溯法
最新推荐文章于 2024-04-30 08:57:10 发布