英文原文:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=greedyAlg
John Smith遇到麻烦了。他是TopCoder的成员,一次他学会掌握了动态规划的“威力”并开始解决一个又一个问题。但是今天他忠诚的电脑表现的非常不友好。同往常的早晨一样,John10点起来,喝了杯咖啡,早饭之前便开始解决问题。事情似乎从一开始就有点不对劲,但是基于他丰富的经验,他瞬间写了一个算法。厌倦了每天早晨一次又一次的分配矩阵,电脑抱怨到:"分段错误"。尽管空着肚子,John还是想出一个聪明的主意,增加一个for循环来处理他所喜爱的矩阵,但是电脑哭诉到:"时间超时"。
John没有发狂,相反却做了一个全新的决定。编程已经够多了,他决定休个假作为自已努力工作的奖励。
John体力充沛,他想要充分利用生命中的每一分钟。但不幸的是,有那么多事情要做,他不能把时间全部用来享受。因此,一吃过早饭他就设计了一个"娱乐计划",计划中描述了他将要进行活动的时间表:
他现在希望能够充分利用他所会的。如此精细的计划需要足够多的精力,但是他的心思早就跑到休假上去了。这就是John Smith的问题,他需要我们的帮助。
我们能帮助他渡过一个愉快的假期吗?也许可以!但是首先我们来做个假设。因为John是一个一细不苟的程序员,一但他认定了某事就会一直按计划进行下去。因此,每一个单独的活动可能被选择也可能不被选择。因为两个选择都依赖于第一个活动,我们可以依据第二个活动做另外两个选择。简单分析的,我们会有2^N种选择,在我们的安全中结果是1024。然后我们可以检查每一个单独的活动是否是在时间允许的范围内。在这些可选集中,找到一个包括最大活动的结果是很容易的。因为有很多可选项,John需要寻求电脑的帮助。但是如果有50个活动会是什么情况呢?即使是世界是最快的计算机来处理这个问题也要用数年的时间。因此这个方案明显是不可行的。