动态规划(0-1背包)---找零钱的最少硬币数

###找零钱的最少硬币数java

322. Coin Change (Medium)数组

Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

####题目描述:code

  给一些面额的硬币,要求用这些硬币来组成给定面额的钱数,而且使得硬币数量最少。硬币能够重复使用。ip

  • 物品:硬币
  • 物品大小:面额
  • 物品价值:数量

####思路分析:leetcode

  由于硬币能够重复使用,所以这是一个彻底背包问题。彻底背包只须要将 0-1 背包中逆序遍历 dp 数组改成正序遍历便可。get

####代码:io

public int coinChange(int[]coins,int amount){
    if(amount==0||coins==null||coins.length==0)
        return 0;
    int []dp=new int[amount+1]; //dp[i]表示i能够找零的最少硬币数
    for(int coin:coins){
        for(int i=coin;i<=amount;i++){
            if(i==coin){
                dp[i]=1;
            }else if(dp[i]==0&&dp[i-coin]!=0){
                dp[i]=dp[i-coin]+1;
            }else if(dp[i-coin]!=0){
                dp[i]=Math.min(dp[i],dp[i-coin]+1);
            }
        }
    }
    return dp[amount]==0?-1:dp[amount];
}
相关文章
相关标签/搜索