题目描述
输入:n个物品,它们的价值和它们的dead line,就是在deadline之后不能再卖掉它。而且单位时间只能卖一件物品。
输出:最多获利多少。
例如
输入:4 50 2 10 1 20 2 30 1
输出:80
在第一段时间卖掉最后一个,获得30,然后在第二段时间之前卖掉第一个,获利50,共课获利80.
详情请见file:///F:/problems_2/1456%20--%20Supermarket.mht
贪婪方法的证明
做这道题之后,仔细想想思路。因为写程序的时候发现有很多的逻辑判断,而这些判断写错一个,结果就是错的,用什么来指导自己才能让自己程序的逻辑不出错呢?只能是深入的理解了这个方法,尽可能的抽象。
假设所有物品的deadline最大为t,在每一个时间段卖的物品为N1,N2,…,Nt.在每一时间段可以选择的物品的集合是I1,I2,…It.在每一段时间段i和该时间段之前的决策的集合是D1,D2,…,Dt.显然集合I1,I2,…It满足I1包含I2,I2包含I3,…
思路如下
从时间t到时间1的时间i中,在Ii中找到最优的Ni(其中Ii去除了从i到t选择的物品),同时将物品Ni从集合Ii中去除。
证明:用数学归纳法。也就证明若Di+1是最优的,在Di+1中取得的物体是{Ni+1,Ni+2,…,Nt},在Ii中取最大的Ni和Di+1组成集合Di,则Di也是最优的。
反证,若Di不是最优的,最优的是{Mi,Mi+1,…,Mt}.因为Di+1是最优的,
1) 若Mi不是Ni+1,…,Nt中的一个,那么Mi<=Ni,则{Mi,Mi+1,…,Mt}不是最优的。得证。
2) 若Mi是Ni+1,…,Nt中的一个,那么用Mi替换该物品,直道Mi不是Ni+1,…,Nt中的一个,那么有上一步的证明可知{Mi,Mi+1,…,Mt}不是最优的。得证。