链接: 零钱兑换.
自底向上动态规划
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
# 自底向上
# dp[i] 表示金额为i需要最少的硬币
# dp[i] = min(dp[i], dp[i - coins[j]]+1)
dp = [float("inf")] * (amount + 1)
dp[0] = 0
for i in range(1, amount + 1):
dp[i] = min(dp[i - c] if i - c >= 0 else float("inf") for c in coins ) + 1
return dp[-1] if dp[-1] != float("inf") else -1
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int mymax = amount + 1;
vector<int> dp(amount+1, mymax);
dp[0] = 0;
for(int i = 1; i <= amount; i++) {
vector<int> temp;
for(auto j : coins) {
if(i - j >= 0) temp.push_back(dp[i-j]);
else temp.push_back(mymax);
}
dp[i] = *min_element(temp.begin(), temp.end()) + 1;
}
return dp[amount] <= amount? dp[amount] : -1;
}
};