标签:generated 价格 大于 数组 void new 定义 str ==
子问题定义: 定义一个二维数组b,其中b[i][j]表示用i个硬币是否能兑换价格j,表示第i个币种的面值,
递归关系:
初值设定:
求解顺序:
按下标从小到大依次求解数组b每一列的值,最后二维数组b的右下角元素值即为最终的解。
1 package org.xiu68.ch06.ex7; 2 3 public class Ex6_19 { 4 //数量无限的面值为x1,x2,x3,...,xn的硬币是否能兑换价格v,并且最多只能使用k枚硬币 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 int[] x2=new int[]{5,10}; 8 convertChange(x2, 55, 6); 9 convertChange(x2, 65, 6); 10 System.out.println("***********************"); 11 int[] x=new int[]{3,4}; 12 for(int i=0;i<=15;i++) 13 convertChange(x,i,2); 14 } 15 //coin:硬币面值 16 //v:要兑换的价格 17 //k:最多使用k枚硬币 18 public static void convertChange(int[] x,int v,int k){ 19 boolean b[][]=new boolean[k+1][v+1]; //b[i][j]表示能否最多使用i枚硬币兑换价格j 20 21 for(int i=0;i<=k;i++) 22 b[i][0]=true; //价格0不需要硬币兑换 23 24 for(int j=1;j<=v;j++) //不使用硬币则不可以兑换任何大于0的价格 25 b[0][j]=false; 26 27 //寻找用p枚硬币是否能兑换价格i 28 for(int i=1;i<=v;i++){ 29 for(int p=1;p<=k;p++){ 30 for(int j=0;j<x.length;j++){ 31 32 if(i>=x[j] &&b[p-1][i-x[j]]==true){ //能用p枚硬币是否能兑换价格i 33 b[p][i]=true; 34 break; 35 }else{ //不能用p枚硬币是否能兑换价格i 36 b[p][i]=false; 37 } 38 39 }//for3 40 }//for2 41 }//for1 42 System.out.println(v+":"+b[k][v]); 43 } 44 //运行结果 45 /* 55:true 46 65:false 47 *********************** 48 0:true 49 1:false 50 2:false 51 3:true 52 4:true 53 5:false 54 6:true 55 7:true 56 8:true 57 9:false 58 10:false 59 11:false 60 12:false 61 13:false 62 14:false 63 15:false*/ 64 }
标签:generated 价格 大于 数组 void new 定义 str ==
原文地址:http://www.cnblogs.com/xiu68/p/7988989.html