贪心策略求解特定硬币问题正确性的证明

968 阅读1分钟

问题描述

假设零钱系统的币值是{1,p^1,p^2,...,p^n},p>1,且每种钱币的数量都满足要求,设计一个最坏情况下时间复杂度最低的算法,使得对任何钱数y,该算法得到的零钱个数最少。

贪心策略

按币值从大到小排列零钱,从币值大的开始,每种钱尽量多用。如果剩余零钱小于该币值,再考虑用下一种钱币。

证明

对于币值系统{1,p^1,p^2,...,p^n},p>1,钱数y而言,假设根据贪心选择得到的解排列为{a_0,a_1,a_2,...,a_n},即y=a_0+a_1p+...+a_np^n;又存在最优解为{b_0,b_1,b_2,...,b_n},y=b_0+b_1p+...+b_np^n

现通过反证法证明两者相同。若贪心解与最优解不同,则不妨假设按币值从大到小取零钱时,第一次出现不同的位置为k,即a_i=b_i(k<i\leqn),因为贪心策略的性质,必有a_k>b_k。同时,对于0\leqi<k而言,必有b_i<p,因为若b_i\geqp,则可用一张pi+1币值代替p张pi币值,零钱个数减少,与最优解的最优性矛盾。

因为y=a_0+a_1p+...+a_np^n=b_0+b_1p+...+b_np^n,第一次出现不同的位置为k,a_i=b_i(k<i\leqn),故有a_0+a_1p+...+a_kp^k=b_0+b_1p+...+b_kp^k。根据0\leqi<k,b_i<p,可知b_i\leqp-1,从而b_0+b_1p+...+bk-1pk-1+b_kp^k\leqp-1+(p-1)p+...+(p-1)pk-1+b_kp^k\leq(p-1)(1-p^k) \over {1-p}+b_kp^k\leq(b_k+1)p^k-1<a_kp^k\leqa_0+a_1p+...+a_kp^k,与两者相等矛盾,综上,贪心解必为最优解。