《入门经典》——6.26
乘船问题:
有n个人,第i个人重量为wi,每艘船的最大载重量均为C,且最多只能乘2个人。用最少的船装载所有人。
分析:显然这道题考查我们对贪心法的理解。在很多问题中,往往是贪心策略的给出很容易但是证明却比较困难。这里我们将给出证明来开始尝试掌握对算法正确性的证明的几种方法。
首先我们给出贪心策略,首先基于对n个人体重从小到大的排序,我们将没有上船的人设为集合A的元素。
从集合A中最小的元素i开始,令其上船。
如果A中没有元素能和i同船,那么令i单独一船。
否则,令能够和i乘船的所有元素中最大的那个元素j和其乘船。
贪心策略的证明:
考虑反证法,假设这种策略下我们得到的不是贪心策略,我们基于另外的最优解来开始进行讨论。
在假想的最优策略中
主要考虑一同乘船的i和k,则比存在某元素j,使得i+j≤n且k≤j,那么我们看到,如果将j和k交换,对于i乘坐的船必然不会受到影响,即贪心策略最起码会保留我们假想的最优解,同时,由于k比j小,存在这样的可能性,j原来单独乘船,但是k与其调换之后,可以使得另外的元素k’加入这条船,这就优化了我们假想的最优解,可见我们假想的最优解并不是最优解。
证毕。