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 }
View Code

 

posted @ 2017-12-05 19:36  清风☆薰衣草  阅读(309)  评论(0编辑  收藏  举报