package com.wentora.exercise; /** * 贪心算法求解找硬币问题 * 假定:硬币的面值由大到小顺序输入 * 如果不是,则需要排序即可 * 递归求解 * 迭代求解 * @author wentora */ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class CoinGreedy { int[] coin; int[] res; List<Integer> list = new LinkedList<Integer>(); CoinGreedy(int[] coin) { this.coin = coin; res = new int[1000]; } //递归求解 public void greedyGetMin(int number) { if(number < 0) { System.out.println("no answer !"); return ; } else if(number == 0) System.out.println("the result by recurse is : " + list); else { int k = 0; while(k < coin.length && coin[k] > number) k++; if(k == coin.length) { System.out.println("no answer !"); return; } list.add(coin[k]); greedyGetMin(number - coin[k]); } } List<Integer> list2 = new ArrayList<Integer>(); //求已求得的数组和 public int getSum(int number) { int sum = 0; for(int i = 0; i < list2.size(); i++) sum += list2.get(i); return sum; } //迭代求解 public void IterGetMin(int number) { if(number <= 0) { System.out.println("No Answer !"); return; } while(getSum(number) <= number) { if(getSum(number) == number) { System.out.println("the result by iter is " + list2); return; } else { int i = 0; while(i < coin.length && coin[i] > number - getSum(number)) i++; if(i == coin.length) { System.out.println("No Answer !"); return; } list2.add(coin[i]); } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int number; System.out.print("please input number : "); number = in.nextInt(); int length; System.out.print("please input coin length : "); length = in.nextInt(); int[] coin = new int[length]; System.out.print("please input coin array : "); for(int i = 0; i < length; i++) coin[i] = in.nextInt(); CoinGreedy cg = new CoinGreedy(coin); cg.greedyGetMin(number); cg.IterGetMin(number); } }