Java实现贪心算法(找零钱问题)
1 package com.java; 2 3 import java.util.Random; 4 /** 5 * 贪心算法 6 * 贪心算法,又称贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择。 7 * 也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。 8 * 9 * 贪心算法的基本思路如下: 10 * 1.建立数学模型来描述问题。 11 * 2.把求解的问题分成若干个子问题。 12 * 3.对每一子问题求解,得到子问题的局部最优解。 13 * 4.把子问题的局部最优解合成原来解问题的一个解。 14 * 15 * 其实现框架如下: 16 * 从问题的某一初始解出发; 17 * while (能朝给定总目标前进一步) 18 * { 19 * 利用可行的决策,求出可行解的一个解元素; 20 * } 21 * 由所有解元素组合成问题的一个可行解。 22 */ 23 24 /** 25 * 钱币找零问题描述: 26 * 假设1元、2元、5元、10元、20元、50元、100元的纸币,分别有c0, c1, c2, c3, c4, c5, c6张。 27 * 现在要用这些钱来支付K元,至少要用多少张纸币? 28 * 用贪心算法的思想: 29 * 每一步尽可能用面值大的纸币,在程序中需要事先将Value按照从小到大的顺序排好。 30 */ 31 public class Greed { 32 33 //人民币面值集合 34 static int[] values = {1, 2, 5, 10, 20, 50, 100}; 35 //各种面值对应数量集合 36 static int[] counts = {20, 10, 20, 11, 6, 3, 5}; 37 38 public static void main(String[] args) { 39 Random ra = new Random(); 40 int chgn = ra.nextInt(500) + 1; 41 int[] num = change(chgn, values, counts); 42 System.out.println("需要找零面额\t: " + chgn); 43 System.out.println("-------------------------\r\n应找:"); 44 print(num, values); 45 } 46 47 /** Function:change 找零钱 48 * @param money:人民币数额 49 * @param values:面值集合 数组 50 * @param counts:现有各面值对应数量集合 数组 51 * @return: 各面值需要数量集合 数组 52 */ 53 public static int[] change(int money, int[] values, int[] counts) { 54 //用来记录需要的各种面值张数 55 int[] result = new int[values.length]; 56 57 for (int i = values.length - 1; i >= 0; i--) { 58 //需要最大面值人民币张数 59 int c = Math.min(money / values[i], counts[i]); 60 //剩下钱数 61 money = money - c * values[i]; 62 //将需要最大面值人民币张数存入数组 63 result[i] = c; 64 } 65 return result; 66 } 67 68 private static void print(int[] num, int[] values) { 69 for (int i = 0; i < values.length; i++) { 70 if (num[i] != 0) { 71 System.out.println("面额为 " + values[i] + "\t元: " + num[i] + "\t张"); 72 } 73 } 74 } 75 }