问题描述
假设零钱系统的币值是{1,,
,...,
},p>1,且每种钱币的数量都满足要求,设计一个最坏情况下时间复杂度最低的算法,使得对任何钱数y,该算法得到的零钱个数最少。
贪心策略
按币值从大到小排列零钱,从币值大的开始,每种钱尽量多用。如果剩余零钱小于该币值,再考虑用下一种钱币。
证明
对于币值系统{1,,
,...,
},p>1,钱数y而言,假设根据贪心选择得到的解排列为{
,
,
,...,
},即y=
+
+...+
;又存在最优解为{
,
,
,...,
},y=
+
+...+
。
现通过反证法证明两者相同。若贪心解与最优解不同,则不妨假设按币值从大到小取零钱时,第一次出现不同的位置为k,即=
(k
i
n),因为贪心策略的性质,必有
>
。同时,对于0
i
k而言,必有
p,因为若
p,则可用一张pi+1币值代替p张pi币值,零钱个数减少,与最优解的最优性矛盾。
因为y=+
+...+
=
+
+...+
,第一次出现不同的位置为k,
=
(k
i
n),故有
+
+...+
=
+
+...+
。根据0
i
k,
p,可知
p-1,从而
+
+...+bk-1pk-1+
+
+...+
pk-1+
+
-1
+
+...+
,与两者相等矛盾,综上,贪心解必为最优解。