package com.wentora.exercise; /** * 求解找硬币最小方案数 * 递归求解 * 非递归求解 * @author wentora */ import java.util.Scanner; public class CoinDynamic { private int[] coin; CoinDynamic( int[] coin) { this.coin = coin; } public int getMinMethod(int number) { if(number <= 0) return 0; int temp = 1000; for(int i = 0; i < coin.length; i++) { if(number - coin[i] < 0) continue; if(getMinMethod(number - coin[i]) <= temp) temp = getMinMethod(number - coin[i]); } return temp + 1; } public int dp_getMinMethod(int number) { int[] count = new int[number + 1]; for(int i = 1; i <= number; i++) count[i] = 10000; for(int i = 1; i <= number; i++) { for(int j = 0; j < coin.length; j++) { if(coin[j] <= i && count[i] > count[i - coin[j]] + 1) count[i] = count[i - coin[j]] + 1; } } return count[number]; } /** * @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 size : "); length = in.nextInt(); int[] coin = new int[length]; System.out.print("please input coin : "); for(int i = 0; i < length; i++) coin[i] = in.nextInt(); CoinDynamic cd = new CoinDynamic(coin); System.out.println("The min is : " + cd.getMinMethod(number)); System.out.print("The min by dp is : " + cd.dp_getMinMethod(number)); } }