今有面值为 1、5、11 元的硬币各无限枚。 想要凑出n 元,问需要的最少硬币数量。java代码
时间: 2024-09-18 21:15:59 浏览: 67
这个问题可以使用动态规划(Dynamic Programming)方法解决,特别是贪心算法的一种变体,叫做“背包问题”(Knapsack Problem)。下面是一个简单的Java代码实现,用于求解这个问题:
```java
public class CoinChange {
public int coinChange(int[] coins, int n) {
int[] dp = new int[n + 1]; // 初始化动态规划数组,dp[i] 存储凑 i 元所需的最小硬币数量
dp[0] = 0; // 0元不需要任何硬币,所以最小硬币数量为0
// 从1元到n元遍历,对于每一个金额
for (int i = 1; i <= n; i++) {
dp[i] = Integer.MAX_VALUE; // 初始化为最大的整数值,表示无法凑出这个金额
// 对于每个面值的硬币,看是否能用它凑出当前金额
for (int j = 0; j < coins.length && i >= coins[j]; j++) {
// 如果能,更新最小硬币数量
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1); // 凑出 i 元,可能少一枚 coins[j] 面值的硬币
}
}
// 如果n元无法凑出,返回-1,否则返回实际的最小硬币数量
return dp[n] == Integer.MAX_VALUE ? -1 : dp[n];
}
public static void main(String[] args) {
CoinChange coinChange = new CoinChange();
int[] coins = {1, 5, 11}; // 面值
int n = 15; // 需要凑出的钱数
System.out.println("最少硬币数量: " + coinChange.coinChange(coins, n));
}
}
```
这个代码首先初始化一个大小为`n + 1`的动态规划数组,然后通过两层循环遍历所有可能的组合,每次都尝试用当前面值的所有硬币替换掉一部分较小面额的硬币,以达到节省硬币的目的。最后返回`dp[n]`,即凑出`n`元所需的最少硬币数量,如果无法凑出则返回`-1`。
阅读全文