算法学习关于C++友元函数,私有成员的了解

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_40801709/article/details/91415164