面值为 2 5 7 的硬币、用最少数量的硬币付款、java代码实现
时间: 2024-03-17 08:43:01 浏览: 118
以下是使用Java语言实现面值为2、5、7的硬币中,使用最少数量的硬币付款的代码实现:
```java
public static int minCoins(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.length; j++) {
if (coins[j] <= i && dp[i - coins[j]] != Integer.MAX_VALUE) {
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}
public static void main(String[] args) {
int[] coins = {2, 5, 7};
int amount = 27;
int res = minCoins(coins, amount);
System.out.println(res); // 输出结果为4
}
```
其中,coins是表示硬币面值的数组,amount是要付款的总价值。首先创建一个大小为amount+1的数组dp,用于记录凑出每个价值所需要的最少硬币数。由于最多需要amount个硬币,所以将dp数组初始化为Integer.MAX_VALUE,表示无法凑出该价值。将dp[0]初始化为0,因为付款总价值为0时不需要任何硬币。
接下来使用两个for循环,外层循环枚举要凑出的价值i,内层循环枚举硬币面值。如果硬币面值小于等于i,并且dp[i - coins[j]]不等于Integer.MAX_VALUE,则可以使用该硬币,更新dp[i]的值。具体更新方式为,如果使用面值为coins[j]的硬币,则还需要凑出i-coins[j]的价值,所以dp[i]可以更新为dp[i - coins[j]] + 1,表示使用该硬币再加上凑出i-coins[j]所需要的最少硬币数。
最后返回dp[amount]的值,如果dp[amount]仍然为Integer.MAX_VALUE,则表示无法凑出该价值,返回-1即可。
阅读全文