货箱装载问题
1.问题描述
有多个货箱,它们的重量分别是【 w1, w2, w3, ······,wn】,货船的最大载重为W,设计方法,使货船能装上尽量多的货箱。
2.解题思路
把货箱分步装载到货船上,一步装载一个货箱。每步决定装载哪个货箱。
贪婪准则:从剩下的货箱中,选择重量最小的货箱。
3.实现代码
#include<iostream>
#include<vector>
#include<algorithm>
using std::vector;
using std::cin;
using std::cout;
int main()
{
vector<int> ori; //存入各个货箱的重量
int w;
cin >> w;//货船的最大载重
int i;
while(cin >> i)// Crtl + Z 结束输入
ori.push_back(i);
vector<int> sort_ori(ori);
//使用默认的 < 对货箱重量排序
sort(sort_ori.begin(), sort_ori.end());
int sum = 0;
//计算出能装载的最大数量
for(auto m : sort_ori)
{
w -= m;
if(w >= 0)
++sum;
else break;
}
cout << "It can load up: " << sum << std::endl;
cout << "Their order number are : ";
//找出满足装船货箱的序号,序号从 1 开始
while(sum)
{
auto pos = ori.begin();// vector<int>::iterator
int c = 0;
// 解决货箱重量重复带来的查找麻烦
while(sum != 1 && sort_ori[sum- 1] == sort_ori[sum - 2])
{
c = find(pos, ori.end(), sort_ori[--sum]) - ori.begin() +1 ;
pos = c + ori.begin() ;
cout << c << " ";
}
cout << find(pos, ori.end(), sort_ori[--sum]) - ori.begin() + 1 << " " ;
}
return 0;
}
4. 思路
1、要解决做多能装多少个货箱的问题是很简单的,只需将货箱的重量进行排序(本例最好从小到大),便能通过从小到大累加,计数最大数目的货箱,使总重量趋于(但不大于)或等于货船的最大载重。排序的策略众多,本例选取标准模板库提供的排序算法 sort(b,e);
2、由算法选择引入的难点,虽然这不属于该问题的思维,但是有必要说明一下。通多不同的策略存储货箱的重量和排序货箱的重量,在解决该步骤时,有众多不同的方法。延续对标准模板排序算法的选择,本例继续使用标准模板库中的查找算法 find(b, e, value); 这样做便将难点引入了程序(不好处理货箱重量重复的情况。)
3、难点是找出重量相同的货箱的序号。本例采用将货箱重量序列中(ori)的首迭代器用来初始化一个迭代器类型变量pos,从灵活处理查找范围[ b, e)中的起始位的方法。
贪婪的正确性
显然正确。