• [动态规划] 找硬币问题


    问题:

    有3,5,7分钱的硬币,以及给定的数额N,求找开N所需的最小硬币数目。

    扩展问题:

    有(V1, V2, V3, ..., Vm)硬币面额,面额数目为m,以及给定的数额N,求找开N所需的最小硬币数目,或断定不能找开。

     


     

    硬币找零是比较经典的动态规划问题,在某些面额组合的情况下,可以用贪心算法求解。《算法导论》中将硬币找零问题作为贪心算法的例子。在这里,随机选取三个素数作为面额。

     

    对于某一数额N,若能被给定的面额找开,可以分为两种情况。

    1、N恰好等于某一硬币的面额,这样找开N只需一枚硬币;

    2、N需要多枚硬币才能找开。

    现在主要分析第二种情况。当一枚硬币找不开时,则数额N一定可以被分为两个子数额N1,N2的找零问题,其中N1+N2=N,且要分别找到N1,N2的最优解。

    定义f(N)为对数额N的找零最小硬币数,可以写出递归式。

    f(N) = 1                                   N恰好为某一硬币面额

    f(N) = min(i from 1 to N/2) ( f(i) + f(N-i) )     N不是硬币面额

    可以利用动态规划求解。以23为例进行计算。

    N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    f(N) -1 -1 1 -1 1 2 1 2 3 2 3 2 3 2 3 4 3 4 3 4 3 4 5

     

     

     

    f(23) = 5

    数额23在硬币面额为(3,5,7)的情况下可以找开,最少需要5枚硬币。

  • 相关阅读:
    java源码ReentrantLock源码分析1
    java源码Semaphore源码分析
    java源码HashMap源码分析
    java源码LinkedHashMap类设计
    java源码HashMap类设计
    java源码ConcurrentHashMap分析1
    java源码CountDownLatch源码分析
    转linux误删文件恢复 简单
    「翻译」Redis协议 简单
    刘昕明:送给和我一样曾经浮躁过的PHP程序员 简单
  • 原文地址:https://www.cnblogs.com/terencezhou/p/2665064.html
Copyright © 2020-2023  润新知