import sys
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
m = len(coins)
dp = [sys.maxsize] * (amount + 1)
dp[0] = 0
for i in range(m):
for j in range(coins[i], amount+1):
if dp[j-coins[i]] != sys.maxsize:
dp[j] = min(dp[j], dp[j-coins[i]]+1)
if dp[amount] == sys.maxsize:
return -1
return dp[amount]
c++
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
// state: dp[i]表示凑成i所需的最少硬币个数
// basecase: dp[coin] = 1 其他位置为INT_MAX-1
// transfer: 遍历所有coin dp[i] = min(dp[i], dp[i-coin]+1)
// result: dp[amount]
vector<int> dp(amount+1, INT_MAX-1); // INT_MAX-1是防止+1后整型溢出
for (auto& coin : coins) {
// 防止索引越界
if (coin >= amount+1) continue;
dp[coin] = 1;
}
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (auto& coin : coins) {
// 防止索引越界
if (i < coin) continue;
dp[i] = min(dp[i], dp[i-coin]+1);
}
}
return dp[amount] == INT_MAX-1 ? -1 : dp[amount];
}
};