• Leetcode 322.零钱兑换


    零钱兑换

    给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

    示例 1:

    输入: coins = [1, 2, 5], amount = 11

    输出: 3

    解释: 11 = 5 + 5 + 1

    示例 2:

    输入: coins = [2], amount = 3

    输出: -1

    说明:
    你可以认为每种硬币的数量是无限的。

     

     

    给一些可用的硬币面值,又给了一个找零钱数,问最小能用几个硬币来组成。跟CareerCup上的9.8 Represent N Cents 美分的组成有些类似,那道题给全了所有的美分,25,10,5,1,然后给一个钱数,问所有能够找零的方法。

    解法:动态规划DP。建立一个一维数组dp,dp[i]表示钱数为i时需要的最少的硬币数,dp[i] = min(dp[i], dp[i - coins[j]] + 1)

     

     1 class Solution {
     2     public int coinChange(int[] coins, int amount) {
     3         if(amount==0) return 0;
     4 
     5         int[] dp = new int [amount+1];
     6         dp[0]=0; // do not need any coin to get 0 amount
     7         for(int i=1;i<=amount; i++)
     8             dp[i]= Integer.MAX_VALUE;
     9 
    10         for(int i=0; i<=amount; i++){
    11             for(int coin: coins){
    12                 if(i+coin <=amount&&(i+coin)>0){
    13                     if(dp[i]==Integer.MAX_VALUE){
    14                         dp[i+coin] = dp[i+coin];
    15                     }else{
    16                         dp[i+coin] = Math.min(dp[i+coin], dp[i]+1);
    17                     }
    18                 }
    19             }
    20         }
    21 
    22         if(dp[amount] >= Integer.MAX_VALUE)
    23             return -1;
    24 
    25         return dp[amount];
    26     }
    27 }
  • 相关阅读:
    直播平台的相关技术(转载)
    各种排序算法分析总结(待整理))
    算法:60.第k个排列
    三种随机化算法:舍伍德算法 拉斯维加斯算法 蒙特卡洛算法
    随机化算法之随机数
    caffe调试
    Euclideanloss_layer层解析
    布线问题(分支限界法)
    最大堆和最小堆
    机器学习知识框架
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235211.html
Copyright © 2020-2023  润新知