首页 > 代码库 > 找零问题
找零问题
1 public class Main { 2 3 /** 4 * 假设有面值1、5、10、21和25分的硬币,找出63分钱,最少用几枚硬币 5 * 用递归来解决 K 分钱的找零问题: 6 * (1)如果可以用一个硬币找零,这就是最少的 7 * (2)否则,对于每个可能的值i,我们可以独立计算找 i 分钱零钱和 K - i 分钱需要的最少硬币数, 然后选择使两者之和最小的i. 8 * @param coins 硬币面值数组 9 * @param change 需要找的钱10 * @return11 */12 public static int makeChange(int[] coins, int change){13 14 int minCoins = change; //最坏的情况时全部用 1 分 的硬币15 16 for (int i = 0; i < coins.length; i++) {17 if (coins[i] == change) {18 return 1; /* 存在刚好匹配的硬币 返回 1 */19 }20 }21 22 for(int j = 1; j <= change/2; j++){23 int thisCoins = makeChange(coins, j) +24 makeChange(coins, change-j);25 26 if (thisCoins < minCoins) {27 minCoins = thisCoins;28 }29 }30 31 return minCoins;32 }33 /**34 * 35 * @param coins36 * @param differentCoins37 * @param maxChange38 * @param coinsUsed39 * @param lastCoin40 */41 public static void makeChange(int[] coins, int differentCoins, int maxChange, int[] coinsUsed,42 int[] lastCoin){43 coinsUsed[0] = 0;44 lastCoin[0] = 1;45 46 for (int cents = 1; cents <= maxChange; cents++) {47 int minCoins = cents;48 int newCoin = 1;49 50 for (int j = 0; j < differentCoins; j++) {51 if (coins[j] > cents) {52 continue;53 }54 if (coinsUsed[cents - coins[j]] + 1 < minCoins) {55 minCoins = coinsUsed[cents-coins[j]] + 1;56 newCoin = coins[j];57 }58 }59 60 coinsUsed[cents] = minCoins;61 lastCoin[cents] = newCoin;62 }63 }64 65 }
找零问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。