计算机算法设计与分析——装载问题
问题描述:
有一批共n 个集装箱要装上艘载重量为c1、c2的两个船上,找出一种最优装载方案,将尽可能重的集装箱装上轮船。
解题思路:
先尽可能的将c1船装满,剩下的装进c2中
主要代码段:
void Backsort(int i)
{
if (i > n) //判断是否达到子节点
{
if (n_weight > best_weight) // 如果当前解大于最优解,则对最优解进行更新
{
for (int i = 1; i <= n; ++i)
{
best[i] = x[i]; //同时更新最优解集,标记为1
}
best_weight = n_weight;
}
return ;
}
r -= weight[i]; //如果编号为 i 物品装进去,需要将它重量减掉
if (n_weight + weight[i] <= c1) //已经装进去的重量加上第 i 个物品的重量,如果小于c1的载重,则表示可以装进去
{
n_weight += weight[i];
x[i] = 1;
Backsort(i + 1);
x[i] = 0;
n_weight -= weight[i];
}
if (n_weight + r > best_weight) //剪枝
{
x[i] = 0;
Backsort(i + 1);
}
r += weight[i];
}
用于判断在将c1装满时,剩余的重量c2是否可以装下
int res = 0;
for (int i = 1; i <= n; ++i)
{
if (best[i] == 0)
res += weight[i];
}
if (res > c2)
{
cout << "装不下" << endl;
}
代码演示:
#include<iostream>
using namespace std;
int n;//集装箱数量
int c1, c2;//船1,2的容量
int n_weight ;//当前装入
int best_weight;//最优载重
int x[10];//判断是否装入
int weight[10];//集装箱重量
int r;//剩余集装箱总重量
int best[10];//最优装入
void output()
{
int res = 0;
for (int i = 1; i <= n; ++i)
{
if (best[i] == 0)
res += weight[i];
}
if (res > c2)
{
cout << "装不下" << endl;
}
else
{
cout << "C1装的物品";
for (int i = 1; i <= n; ++i)
{
if (best[i] == 1)
cout << i<<" ";
}
cout << endl;
cout << "C2装的物品" ;
for (int i = 1; i <= n; ++i)
{
if (best[i] != 1)
cout << i<<" ";
}
}
}
void Backsort(int i)
{
if (i > n)
{
if (n_weight > best_weight)
{
for (int i = 1; i <= n; ++i)
{
best[i] = x[i];
}
best_weight = n_weight;
}
return ;
}
r -= weight[i];
if (n_weight + weight[i] <= c1)
{
n_weight += weight[i];
x[i] = 1;
Backsort(i + 1);
x[i] = 0;
n_weight -= weight[i];
}
if (n_weight + r > best_weight)
{
x[i] = 0;
Backsort(i + 1);
}
r += weight[i];
}
int main()
{
void input()
{
r = 0;
n_weight = 0;
best_weight = 0;
cout << "请输入集装箱数量" << endl;
cin >> n;
cout << "请输入船的容量" << endl;
cin >> c1 >> c2;
cout << "请输入集装箱重量" << endl;
for (int i = 1; i <= n; ++i)
{
cin >> weight[i];
r += weight[i];
}
Backsort(1); // 从第一个节点开始便利
output();
system("pause");
return 0;
}