零錢兌換(動態規劃)

2022-06-27 11:30:13 字數 1306 閱讀 9858

leetcode_322_零錢兌換:

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

示例 1:

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

輸出: 3

解釋: 11 = 5 + 5 + 1

示例 2:

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

輸出: -1

求最有解,動態規劃解決。

解法1:暴力遞迴,超時,時間複雜度o(n^2)

class

solution

else

}public

static

int coinchange1(int coins, int

amount)

for (int

coin : coins)

}int min =integer.max_value;

for (int

coin : coins)

if (min ==integer.max_value)

else

}}

解法2:動態規劃

(1)定義狀態:假設dp(n)是湊到n分需要的最少硬幣個數

(2)求遞推式:

如果第 1 次選擇了 25 分的硬幣,那麼 dp(n) = dp(n – 25) + 1

如果第 1 次選擇了 20 分的硬幣,那麼 dp(n) = dp(n – 20) + 1

如果第 1 次選擇了 5 分的硬幣,那麼 dp(n) = dp(n – 5) + 1

如果第 1 次選擇了 1 分的硬幣,那麼 dp(n) = dp(n – 1) + 1

所以 dp(n) = min + 1

初始狀態:

dp[0]=0

所有dp[i]都初始化為integer.max_value

public

static

int coinchange(int coins, int

amount)

int dp = new

int[amount + 1];

for (int i = 1; i < amount + 1; i++)

if (i - coins[j] >= 0)

}if (min ==integer.max_value)

else

}return

dp[amount];

}

動態規劃 零錢兌換

問題描述 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。比如coins 1,2,5 amount 11,11 5 5 1,最終結果為3 演算法思路 本...

零錢兌換 動態規劃

給定不同面額的硬幣coins和乙個總金額amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 ...

動態規劃 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 ...