Ex 6_18 硬币有限的兑换问题_第七次作业
Posted 薰衣草
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ex 6_18 硬币有限的兑换问题_第七次作业相关的知识,希望对你有一定的参考价值。
子问题定义: 定义一个二维数组b,其中b[i][j]表示前i个币种是否能兑换价格j,表示第i个币种的面值,第i个币种的使用有两种情况,若使用,则b[i][j]=b[i-1][j-],若不使用,则b[i][j]=b[i-1][j]
递归关系:
初值设定:
求解顺序:
按下标从小到大依次求解数组b每一行的值,最后二维数组b的右下角元素值即为最终的解。
1 package org.xiu68.ch06.ex7; 2 3 public class Ex6_18 { 4 5 //面值为x1,x2,x3,...,xn的硬币是否能兑换价格v,每个硬币只能使用一次(解法有点类似于0-1背包问题) 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int[] x=new int[]{1,3,5,6}; 9 for(int i=0;i<=20;i++) 10 convertChange(x, i); 11 } 12 //coin:硬币面值 13 //v:要兑换的价格 14 public static void convertChange(int[] x,int v){ 15 boolean[][] b=new boolean[x.length+1][v+1]; //b[i][j]表示使用前i个币种是否能兑换价格j 16 for(int i=0;i<=x.length;i++) 17 b[i][0]=true; //表示任何币种可以兑换价格0 18 for(int j=1;j<=v;j++) 19 b[0][j]=false; //没有硬币则不可以兑换任何大于0的价格 20 21 for(int i=1;i<=x.length;i++){ 22 for(int j=1;j<=v;j++){ 23 24 boolean use=false; 25 if(j>=x[i-1]) //价格j要大于等于第i个币种才能用第i个币种兑换 26 use=b[i-1][j-x[i-1]]; //使用第i个币种的情况 ,x[i-1]:第i个币种下标为i-1 27 boolean nuse=b[i-1][j]; //不使用第i个硬币的情况 28 29 if(use || nuse) //只要有一种情况可以兑换则前i个币种能兑换价格j 30 b[i][j]=true; 31 else 32 b[i][j]=false; 33 }//for2 34 }//for1 35 36 System.out.print(v+":"+b[x.length][v]); 37 38 if(b[x.length][v]){ 39 System.out.print(" use: "); 40 for(int i=x.length,j=v;i>0 && j>0;){ 41 if(j>=x[i-1] && b[i-1][j-x[i-1]]){ //使用了第i个币种 42 System.out.print(x[i-1]+" "); 43 j=j-x[i-1]; 44 i--; 45 }else{ //没有使用第i个币种 46 i--; 47 } 48 }//for 49 } 50 System.out.println(); 51 } 52 //运行结果: 53 /*0:true use: 54 1:true use: 1 55 2:false 56 3:true use: 3 57 4:true use: 3 1 58 5:true use: 5 59 6:true use: 6 60 7:true use: 6 1 61 8:true use: 5 3 62 9:true use: 6 3 63 10:true use: 6 3 1 64 11:true use: 6 5 65 12:true use: 6 5 1 66 13:false 67 14:true use: 6 5 3 68 15:true use: 6 5 3 1 69 16:false 70 17:false 71 18:false 72 19:false 73 20:false*/ 74 }
以上是关于Ex 6_18 硬币有限的兑换问题_第七次作业的主要内容,如果未能解决你的问题,请参考以下文章