有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且w1+w2+...+wn<=c1+c2。
装载问题要求确定,是否有一个合理的装载方案可将这n个集装箱装上这2搜轮船。如果有,找出一种方案。
分析:如果一个给定的装载问题有解,则采用下面的策略可以得到最有装载方案。(1)首先将第一艘轮船尽可能装满;(2)然后将剩余的集装箱装上第二艘轮船。将第一艘轮船装满等价于选取全体集装箱的一个子集,使该子集的集装箱重量之和最接近c1。
递归回溯
#include <iostream>
using namespace std;
typedef int Type;
template<typename Type> class Loading;
template<typename Type>
Type MaxLoading(Type w[], Type c, int n, int bestx[]);
template<typename Type>
class Loading
{
public:
friend Type MaxLoading<Type>(Type w[], Type c, int n, int bestx[]);
private:
void Backtrack(int i);
int n, //集装箱数
*x, //当前解
*bestx; //当前最优解
Type* w, //集装箱重量数组
c, //第一艘轮船的载重量
cw, //当前载重量
bestw, //当前最优载重量
r; //剩余集装箱重量
};
template<typename Type>
void Loading<Type>::Backtrack(int i)
{//搜索第