子问题定义:定义一个数组b,大小比兑换价格的大小多一个元素,其中b[i]表示是否能用面值为x1,x2,x3,..,xn的硬币兑换价格i。
递归关系:
初值设定:设b[0]=true
求解顺序:按下标从小到大依次求解b[i]的值,最后返回b[v]中的结果即为最终结果。
1 package org.xiu68.ch06.ex7; 2 3 public class Ex6_17 { 4 5 //数量无限的面值为x1,x2,x3,...,xn的硬币是否能兑换价格v 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int[] coin=new int[]{5,6}; 9 for(int i=0;i<=30;i++) 10 convertChange(coin,i); 11 } 12 13 //coin:硬币面值 14 //v:要兑换的价格 15 public static void convertChange(int[] x,int v){ 16 boolean b[]=new boolean[v+1]; //能否用硬币兑换价格v 17 b[0]=true; 18 19 for(int i=1;i<=v;i++){ //能否用硬币兑换价格i (子问题的规模) 20 for(int j=0;j<x.length;j++){ 21 if(i>=x[j] && b[i-x[j]]==true){ 22 b[i]=true; 23 break; 24 }else{ 25 b[i]=false; 26 } 27 } 28 } 29 System.out.println(v+":"+b[v]); 30 } 31 32 //运行结果 33 /* 0:true 34 1:false 35 2:false 36 3:false 37 4:false 38 5:true 39 6:true 40 7:false 41 8:false 42 9:false 43 10:true 44 11:true 45 12:true 46 13:false 47 14:false 48 15:true 49 16:true 50 17:true 51 18:true 52 19:false 53 20:true 54 21:true 55 22:true 56 23:true 57 24:true 58 25:true 59 26:true 60 27:true 61 28:true 62 29:true 63 30:true*/ 64 }