算法导论上第16-1问题
考虑用最少的硬币数找n分钱的问题,假设每个硬币的值都是整数。
先证明问题具有最优子结构。假设对找n分前有最优解,而且最优解中使用了面值c的硬币,最优解使用了k个硬币。那么,这个最优解包含了对于找n-c分钱的最优解。显然,n-c分钱中使用了k-1个硬币。如果n-c分钱还有一个解使用了比k-1少的硬币,那么使用这个解可以为找n分钱产生小于k个硬币的解。与假设矛盾。
对于有些情况下,贪心算法可能不能产生最优解。比如硬币面值1,10,25.找30分钱,最优解是3*10,而贪心的情况下产生的解是1*5+25.
问题b可以作为一个结论:假设可换的硬币单位是c的幂,也就是c0,c1, ..., ck, 其中整数c>1, k>=1, 这种情况下贪心算法可以产生最优解。
问题的证明用到了引理:对于i=0,1,..., k, 设ai是找n分钱的最优解中面值ci 的数量。那么对i=0,1,...,k-1,有ai<c.
证明:假设ai>=c,对于0<=i<k. 则可以改进最优解通过增加一个面值ci+1的硬币和减少c个面值ci的硬币,这样找零钱的总数不变,但减少了c-1个硬币。于是,这个比最优解还要优化,矛盾。
然后证明问题具有贪心选择性质,即贪心选择具有最优解。这里证明不用贪心选择不能产生最优解。设j=max{0<=i<=k: ci<=n}.