这题想了很久,采用动态规划这个基本格调是肯定的

1. new 一个 dp[] ,length 分别+1
2. 横向/竖向 值为0的先进行初始化
3.双重for循环,填充每个dp的值.
    case 1: 待兑换的钱==零钱的面额   dp[i+1][j]=1

    case 2: 待兑换的钱<零钱的面额  
                 dp[i+1][j]=dp[i][j]  采用上一行的兑换的最小值

    case 3: 待兑换的钱 > 零钱的面额 
                l 理论值  :dp[i+1][j]=1+dp[i+1][余数]
                       case 4: 余数==0,则 dp[i+1][j]=1
                       case 5: 余数!=0 继续判断
                                                case 6:   dp[i+1][余数]==0,说明兑换不成功 则  dp[i+1][j]=dp[i][j] 
                                                case 7:   dp[i+1][余数]!=0.说明能兑换成功,则   dp[i+1][j]=Math.min(1+dp[i+1][余数],   dp[i][j]  )

最后返回 dp[arr.length][length];