动态规划法求解硬币找零(Java)

算法描述:
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。基本思想也是将待求解问题分解成若干个子问题,先求解子问题,并将子问题的结果保存下来,然后从这些子问题的解得到原问题的解。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。
问题描述:
现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?
解题思路:
1,找出面值最接近T的硬币V
2,将f(T)问题的求解转换成f(T-V)+1问题的求解,以此出现递归
代码实现:
CoinChange类用于处理硬币找零的业务:
[java]  view plain  copy
  1. public class CoinChange {  
  2.     /** 
  3.      * 获取找零硬币个数 
  4.      * @param coinValue 硬币的面值   
  5.      * @param totalValue 需要找零的钱数 
  6.      * @return 
  7.      */  
  8.     public int coinNum(int[] coinValue,int totalValue){  
  9.         List<Integer> coins=new ArrayList<Integer>();  
  10.         coins.add(0);  
  11.         for(int i=1;i<=totalValue;i++){  
  12.             int coin=nearestCoin(i,coinValue);  
  13.             int coinNum=coins.get(i-coin)+1;  
  14.             coins.add(coinNum);  
  15.         }  
  16.         return coins.get(totalValue);  
  17.     }  
  18.     /** 
  19.      * 获取最接近找零钱数的硬币面值 
  20.      */  
  21.     private int nearestCoin(int value,int[] coinValues){  
  22.         int res=0;  
  23.         int nearest=Integer.MAX_VALUE;  
  24.         for(int coinValue:coinValues){  
  25.             if(coinValue<=value){  
  26.                 int distance=value-coinValue;  
  27.                 if(distance<nearest){  
  28.                     nearest=distance;  
  29.                     res=coinValue;  
  30.                 }  
  31.             }  
  32.         }  
  33.         return res;  
  34.     }  
  35. }  
Main类用于测试:
[java]  view plain  copy
  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.         CoinChange coinChange=new CoinChange();  
  4.         int res=coinChange.coinNum(new int[]{1,2,3,5,11},81);  
  5.         System.out.println(res);  
  6.     }  
  7. }  
打印输出:9
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值