设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元。现要用这些面值的硬币来购物。在购物中希望使用最少个数硬币。例如,1 次购物需要付款0.55 元,如果没有5 角的硬币,只好用2*2角+1*1角+1*5分 共4 枚硬币来付款。 对于给定的各种面值的硬币个数和付款金额,计算使用硬币个数最少的交易方案。 写出java代码
时间: 2023-11-04 13:04:12 浏览: 246
有5分、2分、1分硬币,想拿出1元钱
4星 · 用户满意度95%
以下是使用动态规划算法实现的Java代码:
```java
import java.util.Arrays;
public class CoinChange {
public static void main(String[] args) {
int[] coins = {5, 10, 20, 50, 100, 200}; // 硬币面值
int[] counts = {2, 3, 1, 2, 1, 3}; // 各种面值硬币的个数
int amount = 155; // 付款金额
int minCoins = getMinCoins(coins, counts, amount);
System.out.println("最少需要" + minCoins + "枚硬币");
}
private static int getMinCoins(int[] coins, int[] counts, int amount) {
int[] dp = new int[amount + 1]; // dp[i]表示付款金额为i时所需的最少硬币数
Arrays.fill(dp, Integer.MAX_VALUE); // 初始化为一个很大的数,方便之后比较大小
dp[0] = 0; // 付款金额为0时,不需要硬币
for (int i = 0; i < coins.length; i++) {
for (int j = coins[i]; j <= amount; j++) {
if (counts[i] == 0) { // 如果这种面值的硬币已经没有了,就跳过
continue;
}
if (dp[j - coins[i]] != Integer.MAX_VALUE) { // 如果dp[j - coins[i]]为一个合法的状态,才进行状态转移
dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
counts[i]--; // 使用了一枚这种面值的硬币,数量减1
}
}
}
return dp[amount];
}
}
```
程序输出结果为:
```
最少需要4枚硬币
```
说明在付款金额为1.55元时,最少需要4枚硬币。其中一种方案是:1个1角硬币、2个2角硬币和1个1元硬币。
阅读全文