贪心法找零钱Java
时间: 2024-05-26 19:09:33 浏览: 150
贪心法是一种常用的解决最优化问题的算法。在找零钱问题中,贪心法是一种可行的算法。具体实现如下:
1. 首先对硬币面值进行从大到小的排序。
2. 从面值最大的硬币开始,将其尽可能多地放入找零钱的集合中,直到无法再放入为止。
3. 接下来考虑面值次大的硬币,重复第2步,直到所有硬币都考虑完毕。
Java代码示例:
```java
public static int[] greedyChange(int[] coins, int money) {
Arrays.sort(coins);
int[] result = new int[coins.length];
for (int i = coins.length - 1; i >= 0; i--) {
result[i] = money / coins[i];
money = money % coins[i];
}
return result;
}
```
相关问题
贪心法解决:将一张100 元的钞票换成1 元、2元、5 元和10 元的零钱,每种零钞至少一张,Java编写程序输出所有的换法,尽可能地提高算法效率。
贪心法是一种优化策略,它每次选择当前状态下最优的选择,期望能够得到全局最优解。在这个问题中,我们需要找寻所有将100元转换成1元、2元、5元和10元零钱的方式。我们可以编写一个Java程序,采用动态规划的方式来解决:
首先,创建一个二维数组dp[][], 其中dp[i]表示i元可以由哪些组合构成。初始化dp[0]到dp[9]都设为true,表示0到9元都可以通过某种组合达到。
然后,从10元开始遍历到100元,对于每个金额i,检查是否能用小于等于i的最大面额(如5元)去除掉i元,如果可以,则更新dp[i]为dp[j]*dp[i-j],其中j是从最大面额递减到1的值。
最后,当dp[100]为true时,说明有解,我们逆向回溯记录下所有可能的组合。
以下是简单的Java代码实现:
```java
public class Change {
public static void main(String[] args) {
boolean[][] dp = new boolean[101][4];
dp[0] = true;
for (int i = 1; i <= 100; i++) {
for (int j = 3; j >= 1; j--) {
if (i >= 10 && i % 10 == 0) {
dp[i] |= dp[i - 10];
} else {
dp[i] |= dp[i - (5 * j)];
}
}
}
printChange(dp);
}
private static void printChange(boolean[][] dp) {
int[] coins = {10, 5, 2, 1};
for (int i = 100; i > 0 && dp[i]; i--) {
for (int coin : coins) {
if (i >= coin) {
System.out.println("1 x " + coin + ", ");
i -= coin;
}
}
}
}
}
```
运行此程序,会输出所有可行的换零钱方案。注意这个算法并不是所有情况都能保证最优解,但在这种特定问题上,贪心法给出了有效的解决方案。
阅读全文