码迷,mamicode.com
首页 > 其他好文 > 详细

硬币找零

时间:2019-11-06 13:05:53      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:out   target   div   sys   方法   假设   color   就是   状态   

动态规划

/**
   *    硬币找零, 假如你的硬币面值有1,2,5等,每种面值的都有无数个,求找零100最少要多少个硬币
 *
 */
public class CoinChange {

    public static void main(String[] args) {
        int [] coins = new int[] {1,2,5};
        System.out.println(getMin(coins,11));
    }
    
    public static int getMin(int [] coins  ,  int target) {
        int [] dp = new int [target +1];   //dp 的下标是要组成的钱数
        //若要组成的是0,那么就不需要硬币
        dp[0] = 0;
        //给其余的赋初始值target+1。,在最后返回时候,作判断使用
        for(int i = 1 ; i < dp.length; i++) {
            dp[i] = target+1;
        }
        //假设我取了一个值为5的硬币,那么由于目标值是 11,所以是不是假如我们知道 dp[6],
        //那么就知道了组成 11 的 dp 值了?所以更新 dp[i] 的方法就是遍历每个硬币,如果遍历到的硬币值小于i值(比如不能用值为5的硬币去更新 dp[3])时,
        //用 dp[i - coins[j]] + 1 来更新 dp[i],所以状态转移方程为:
        //dp[i] = min(dp[i], dp[i - coins[j]] + 1);
        for(int i = 1; i < dp.length; i++) {
            for(int j = 0 ; j < coins.length ; j++) {
                if(coins[j] <= i) {
                     dp[i] = Math.min(dp[i], dp[i-coins[j]] +1);
                }
            }
        }
        return   dp[target]==target+1?-1:dp[target];
    }
}

 

硬币找零

标签:out   target   div   sys   方法   假设   color   就是   状态   

原文地址:https://www.cnblogs.com/moris5013/p/11804400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!