1.最优装载问题。
给出n个物体,第i个物体重量为wi。选择尽量多的物体,使得总重量不 超过C。
由于只关心物体的数量,所以装重的没有装轻的划算。只需把所有物体按重量从小到大 排序,依次选择每个物体,直到装不下为止。
2.部分背包问题。
有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情 况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。
本题在上一题的基础上增加了价值,所以不能简单地像上题那样先拿轻的(轻的可能价 值也小),也不能先拿价值大的(可能它特别重),而应该综合考虑两个因素。一种直观的 贪心策略是:优先拿“价值除以重量的值”最大的,直到重量和正好为C。
注意:由于每个物体可以只拿一部分,因此一定可以让总重量恰好为C(或者全部拿走 重量也不足C),而且除了最后一个以外,所有的物体要么不拿,要么拿走全部。
3.乘船问题。
有n个人,第i个人重量为wi。每艘船的最大载重量均为C,且最多只能乘两 个人。用最少的船装载所有人。
考虑最轻的人i,他应该和谁一起坐呢?如果每个人都无法和他一起坐船,则唯一的方 案就是每人坐一艘船。否则,他应该选择能和他一起坐船的人中最重的 一个j。这样的方法是贪心的,因此它只是让“眼前”的浪费最少。可以用反证法说明。
情况1:i不和任何一个人坐同一艘船,那么可以把j拉过来和他一起坐,总船数不会增 加(而且可能会减少)。
情况2:i和另外一人k同船。由贪心策略,j是“可以和i一起坐船的人”中最重的,因 此k比j轻。把j和k交换后k所在的船仍然不会超重(因为k比j轻),而i和j所在的船也不会超 重(由贪心法过程),因此所得到的新解不会更差。
由此可见,贪心法不会丢失最优解。最后说一下程序实现。在刚才的分析中,比j更重 的人只能每人坐一艘船。这样,只需用两个下标i和j分别表示当前考虑的最轻的人和最重的 人,每次先将j往左移动,直到i和j可以共坐一艘船,然后将i加1,j减1,并重复上述操作。