题目描述
思路
有用回溯做的,但是此题是标准的dp问题。
dp[i] 表示i金钱需要最少零钱数目。
伪代码
for 0 ~ amount
for coin : coins
dp[i] = min(dp[i],dp[i-coin]);
return dp[amount]==amount+1? -1:dp[amount] //判断是否能兑换
代码
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1,amount+1); //dp【i】表示i需要最少硬币
dp[0] = 0;
for(int i=0;i<=amount;i++)
{
for(auto coin:coins)
{
if(i-coin<0)
continue;
dp[i] = min(dp[i],1+dp[i-coin]);
}
//cout<<dp[i]<<"\t";
}
return dp[amount]==amount+1 ? -1:dp[amount];
}
};
重难点
记得初始化dp[0] = 0,否则数组内容全为max。