#include <iostream>
using namespace std;
#define Len(x) sizeof(x)/sizeof(x[0])
//template<class Type> Type MaxLoading(Type[], Type, int);
template<class Type>
class Loading {
template<class Type>//用了模板的友元函数 Type可以改为T,但该行万万不可省略
friend Type MaxLoading(Type [], Type, int);
friend void MaxLoading2(float[], float, int);//一般友元函数
public:
Type MaxLoading3(Type[], Type, int);
private:
void Backtrack(int i);
int n;//集装箱数目
Type* w,//集装箱重量数组
c,//第一艘轮船的载重量
cw,//当前载重量
bestw;//当前最优载重量
};
template<class Type>
void Loading<Type>::Backtrack(int i) {
//搜索到第i层节点
if (i >= n) {//叶节点
if (cw > bestw)
bestw = cw;
return;
}
//搜索左子树
if (cw + w[i] <= c) {
cw += w[i];
Backtrack(i + 1);
cw -= w[i];
}
//搜索右子树
Backtrack(i + 1);
}
//装载问题的实质是在不超载的情况下尽可能装满第一艘船
template<class Type>
Type MaxLoading(Type w[], Type c, int n) {
Loading<Type>X;
//初始化
X.w = w;
X.c = c;
X.n = n;
X.bestw = 0;
X.cw = 0;
//计算最优载重量
X.Backtrack(0);
return X.bestw;
}
void MaxLoading2(float w[], float c, int n) {
Loading<float>Y;
Y.w = w;
Y.c = c;
Y.n = n;
Y.bestw = 0;
Y.cw = 0;
//计算最优载重量
Y.Backtrack(0);
cout << Y.bestw << endl;
}
wrong
//template<class Type>
//Type MaxLoading3(Type w[], Type c, int n) {
// Loading<Type>Z;
// //初始化
// Z.w = w;
// Z.c = c;
// Z.n = n;
// Z.bestw = 0;
// Z.cw = 0;
// //计算最优载重量
// Z.Backtrack(1);
// return Z.bestw;
//}
int main() {
float w[] = { 1.1,2.9,3.3,4.4,6.5 };
int n = Len(w);
float c1 = 6.7;
float c2 = 10.0;
float bestw = MaxLoading<float>(w, c1, n);
MaxLoading2(w, c1, n);
//MaxLoading3(w, c1, n);
cout << "最多载重" << bestw << endl;
system("pause");
return 0;
}