poj 1456 贪婪方法的证明

来源:互联网 发布:cf域名 编辑:程序博客网 时间:2024/05/22 14:24

题目描述

输入: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包含I2I2包含I3

                       

思路如下

从时间t到时间1的时间i中,在Ii中找到最优的Ni(其中Ii去除了从it选择的物品),同时将物品Ni从集合Ii中去除。

证明:用数学归纳法。也就证明若Di+1是最优的,在Di+1中取得的物体是{Ni+1,Ni+2,…,Nt},Ii中取最大的NiDi+1组成集合Di,则Di也是最优的。

反证,若Di不是最优的,最优的是{Mi,Mi+1,…,Mt}.因为Di+1是最优的,

                                                                

1)      Mi不是Ni+1,…,Nt中的一个,那么Mi<=Ni,{Mi,Mi+1,…,Mt}不是最优的。得证。

2)      MiNi+1,…,Nt中的一个,那么用Mi替换该物品,直道Mi不是Ni+1,…,Nt中的一个,那么有上一步的证明可知{Mi,Mi+1,…,Mt}不是最优的。得证。

代码

原创粉丝点击