思路: 求最少的硬币个数,想到用动态规划解题,状态为总金额,最优子结构为总金额为i时的最小硬币个数,自底向上求出总金额为amount时的最小硬币个数。
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
//初始化dp数组,求最小值将每一位初始化为一个较大值
vector<int>dp(amount+1,amount+1);
//当总金额为0时,最小硬币个数为0
dp[0]=0;
//依次求出总金额为i时的最小硬币个数
for(int i=0;i<=amount;i++){
//选择不同面值的金币
for(int j=0;j<coins.size();j++){
if(i>=coins[j])
dp[i]=min(dp[i],1+dp[i-coins[j]]);
}
}
//判断是否存在并返回
return dp[amount]>amount?-1:dp[amount];
}
};