動態規劃(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];
}
相關文章
相關標籤/搜索