1. 程式人生 > >Leetcde---零錢兌換--動態規劃

Leetcde---零錢兌換--動態規劃

零錢兌換

題目連結:零錢兌換

思路:
  • 這題是一個揹包問題,不同的是,沒有給出包的容量限制,利用題目中的例子,給定硬幣coins = {1,2,5},目標值val = 11,可以轉化為求11-1,11-2,11-5,三種所需硬幣最少的數量+1,深入分解,當所求值為1,2,5時,所需硬幣數量為1
  • 可以定義一個dp[],容量為val+1,儲存val為下標值時,所需的最少硬幣數量,這樣定義陣列的缺點是陣列中存在某些值,是所給硬幣拼湊不出來的,造成記憶體浪費。
  • 由於求最少硬幣數,可以將陣列先初始化為val+1,並將dp[0] = 0,即使只給1元的硬幣也僅需要val個硬幣,所以dp[i]值為val+1時,即代表該金額兌換不了硬幣。
  • 遞推式為dp[i] = min{dp[i],dp[i-coins[j]]+1}
  • 這裡不用講dp[coins[j]]置1,因為當求dp[coins[j]]的時候會藉助dp[0] = 0的值
public int coinChange(int[] coins, int amount) {
    if(amount == 0) return 0;
    int[] dp = new int[amount+1];
    Arrays.fill(dp, amount+1);
    dp[0] = 0;
    for(int i = 1; i<=amount; i++)
        for
(int j=0; j<coins.length; j++) { if(i - coins[j] >= 0) { dp[i] = Math.min(dp[i], dp[i-coins[j]] + 1); } } return dp[amount] > amount ? -1 : dp[amount]; }