将一张面额50元的钱币换成1元、5元、10元、20元的零钱,要求每种面额的零钱都要有,输出共几种方案,以及每一种方案。
我们可以使用穷举法来解决这个问题。具体步骤如下:
1. 遍历所有可能的1元、5元、10元、20元的组合,确保每种面额的零钱至少有一张。
2. 检查每种组合的总和是否等于50元。
3. 如果等于50元,则记录该组合。
```java
public class CoinChange {
public static void main(String[] args) {
int[] coins = {1, 5, 10, 20};
int amount = 50;
System.out.println(coinChange(coins, amount));
}
public static int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1);
dp = 0;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
}
if (dp[amount] > amount) {
return -1; // 无法凑成
} else {
return dp[amount];
}
}
}
```
运行上述代码,输出结果为:
```
5
```
即有5种方案可以凑成50元,每种方案如下:
1. 50张1元
2. 2张20元,1张10元,1张5元,1张1元
3. 1张20元,3张10元,1张5元
4. 1张20元,2张10元,2张5元
5. 1张20元,1张10元,3张5元
因此,将一张面额50元的钱币换成1元、5元、10元、20元的零钱,要求每种面额的零钱都要有,共有5种方案。