原题链接
思路:动态规划
- 状态定义 dp[i]:表示兑换 i 元需要的最少钱币数
- dp方程:dp[i] = min{ dp [ i - coins[ j ]] } + 1(+1表示我自己需要使用一张,j 是遍历 coins 数组的下标)
public int coinChange(int[] coins, int amount) {
//coins = [1,2,5,7,10] 金额14
int[] dp = new int[amount+1];
for(int i = 0;i <= amount;i++) {
dp[i] = -1; //最初所有金额的最优解均为-1(不可到达)
}
//dp = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
dp[0] = 0; //金额0 的最优解为0
//dp = [0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
for(int i = 1;i <= amount;i++) { //循环各个面值,找到dp[i]的最优解
for(int j = 0;j < coins.length;j++) {
//如果兑换总额 >= 当前钱币面额 并且 上个状态的最优解是可行的
if(i - coins[j] >= 0 && dp[i-coins[j]] != -1) { //coins[j] 代表索引为 j 的面值
//dp[i] =-1表示当前状态还未更新 || 当前的dp[i] 的可行解 不如 dp[i - coins[j]] + 1
if(dp[i] == -1 || dp[i] > dp[i - coins[j]] + 1) { //dp[i-coins[j]] 代表上个状态的最优解
//则更新 dp[i]
dp[i] = dp[i-coins[j]] + 1;
}
}
}
}
return dp[amount];
}
来源:CSDN
作者:码畜也有梦想
链接:https://blog.csdn.net/QinLaoDeMaChu/article/details/103920254