相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
class Solution {
public int coinChange(int[] coins, int amount) {
int len = coins.length;
if (len <1){
return -1;
}
// dp[n]的值: 表示的凑成总金额为n所需的最少的硬币个数
int[] dp = new int[amount + 1];
// 给dp赋初值,最多的硬币数就是全部使用面值1的硬币进行换
Arrays.fill(dp,amount+1);//设置每个元素都为amount+1,// amount + 1 是不可能达到的换取数量,于是使用其进行填充
dp[0] = 0;
for (int i = 1; i <= amount; i++) {//遍历1 到 amount 的所要达到目标的最小硬币个数
for (int coin : coins) {// 遍历包含的硬币数额种类
if (i-coin >=0){
// dp[i]有两种实现的方式,
// 一种是硬币数额种类包含当前的coins[i],那么剩余钱就是 i-coins[i],这种操作要兑换的硬币数是 dp[i-coins[j]] + 1
// 另一种就是 硬币数额种类不包含该数额,要兑换的硬币数是dp[i]
dp[i] = Math.min(dp[i],dp[i-coin]+1);
//dp[i]的值: 表示的凑成总金额为i所需的最少的硬币个数
}
}
}
//如果目标值没被改动,就返回-1
return dp[amount] == amount+1? -1: dp[amount];
}
}