贪婪算法之货箱装船+读数据结构算法与应用-C++语言描述

算法思想:在贪婪算法(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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值