这里记录一下常见贪心算法的证明,也是算是我自己的一个总结和复习,感觉这个抽象,虽然算法不难,但是要证明比较难,而且每一个种贪心要是没见过还可能真的写不出来,网上看了不少资料结合老师的ppt,如果有说的不对的地方,欢迎大家讨论,单纯当记录。
无论什么贪心算法的证明,我们首先要知道,大体两个步骤:
1.贪心证明
2.最优子结构证明
无论是什么贪心问题,想要证明都是这2步,一般来说,我们的贪心证明常见的就是使用数学归纳法,先k=1,然后k>1,只要成立即可,最优子结构的证明的话,则通常我们是使用的反证法进行证明。
最优装载问题
首先还是证明贪心算法,当k=1,即选一个箱子,那没什么好说呀,就最小,就是贪心
如果k>1,那么在这里就有意思了,我们还是先假设一个解N={1,2,...k+1},按照题目意思,其中w1<=w2<=w3...<=wk+1,那么如果N* = {2,3,...k+1},则C* = C - w1,其最优就为I*,那么I={1}I*,则I是最优,但是呢我感觉这种讲法不是很好。
我换一种,我在其他地方看到的证明法,其实思想差不多,但我觉得这种更好,如果k>1,假设N={x1=1,x2=0,...xk=0,xk+1,....xn},我们只需要证明N为最优解,1就是选,0就是不选嘛,对于重量来说,连加wiNi = 连加wixi - wk + w1 <= C,那也就是将k替换为了1,肯定更小,成立,至于个数1换1自然一样,其实和上面那种是一样的,这不过这个更具体了
最优子结构的证明的话呢,直接假设I不是最优,那么必然存在I**是最优,对吧,也就是说I*>I,那么I*是关于N*和C*的解且I** - {1} > I - {1} = I*,很显然是个悖论,故得证。