标签:
希望确定是否有一种可将所有n个货箱全部装船的方法。若有的话,找出该方法。
主要思想:即求第一艘船的最大装载量问题。每种货物有装和不装两种情况,n个货物的取舍组合共2^n次个分支,利用分支搜索法求最优化问题。
C++代码:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
double MaxLoading(const vector<double> &w,const double c1)
{
double bestW = 0;
queue<double> qw;
int n = w.size();
//-1表示到达层的尾部
qw.push(-1);
//当前的重量
double ew = 0;
//第i箱货物
int i = 0;
while (!qw.empty())
{
//放第i箱货物
if (ew + w[i] <= c1)
{
qw.push(ew+w[i]);
if (ew + w[i] > bestW)
{
bestW = ew +w[i];
}
}
//不放第i箱货物
qw.push(ew);
ew = qw.front();
qw.pop();
//如果一层已经结束
if (-1 == ew)
{
//如果考虑完最后一箱货物
if (i == n-1)
{
return bestW;
}
else
{
qw.push(-1);
}
//如果出队的是-1,则再出队一个元素
ew = qw.front();
qw.pop();
++i;
}
}
}
int main()
{
double c1,c2;
cout<<"请输入c1,c2:";
cin>>c1>>c2;
cout<<"请输入n个货箱的重量:";
vector<double> w;
double tmp_w;
double total_w = 0;
while(cin>>tmp_w)
{
w.push_back(tmp_w);
total_w += tmp_w;
}
if (total_w <= c1 || total_w <= c2)
{
cout<<"一艘船即可!"<<endl;
exit(0);
}
if (total_w > c1+c2)
{
cout<<"无法装载!"<<endl;
exit(0);
}
double Mc1 = MaxLoading(w,c1);
if (total_w - Mc1 <= c2)
{
cout<<"可以装载!"<<endl;
cout<<"第一个船装"<<Mc1<<‘\t‘<<"第二个船装"<<total_w-Mc1<<endl;
}
else
{
cout<<"无法装载"<<endl;
}
return 0;
}
//50 50
// 20 40 40
运行结果:
有两艘船需要装运的n箱货物,第一艘船的载重量是c1,第二艘船的载重量是c2,wi是货箱i的重量,且w1+w2+……+wn<=c1+c2。
标签:
原文地址:http://blog.csdn.net/u011954296/article/details/51334831