算法思想:在贪婪算法(greedy method)中采用逐步构造最优解的方法。在每个阶段,都做出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪婪决策的依据称为贪婪准则(greedy criterion)。
货箱装船:船可以分步装载,每步装一个货箱,且需要考虑装载那一个货箱。根据这种思想可利用如下贪婪准则:从剩下的货箱中,选择重量最小的货箱。这种选择次序可以保证所选的货箱重量最小,从而可以装载更多的货箱。根据这种贪婪策略,首先选择最轻的货箱,然后选次轻的货箱,如此下去直到所有货箱均装上船或船上不能在容纳其他任何一个货箱。
实现代码:
void IndirectSort(int w[], int t[], int n)
{
int i,j,temp;
for (i=0; i<n; ++i)
t[i] = i;
for (i=1; i<n; ++i){
temp = t[i];
for (j=i; j-1>=0&&w[t[j-1]]>w[temp]; --j)
t[j] = t[j-1];
t[j] = temp;
}
}
template <typename T>
void ContaineLoading(int x[], T w[], T c, int n)
{// 货箱装船问题的贪婪算法
// x[i] = 1当且仅当货箱i被装载,1<=i<=n
// c是船的容量,w是货箱的重量
// 对重量按间接寻址方式排序
// t 是间接寻址表
int *t = new int[n+1];
IndirectSort(w, t, n);
// 此时,w[t[i]] <= w[t[t+1]], 1<=i<n
// 初始化x
for (int i=1; i<=n; ++i)
x[i] = 0;
// 按重量次序选择物品
for (int i=1; i<=n && w[t[i]]<=c; ++i){
x[t[i]] = 1;
c -= w[t[i]];//剩余容量
}
delete[] t;
}