• 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
  • 相关阅读:
    (转)Android 升级 ADT 之后报错之一 case语句 .
    myeclipse CTRL+1功能
    (转)项目延期原因及应对之道
    shiro的使用2 灵活使用shiro的密码服务模块
    shiro的使用1 简单的认证
    最全的 eclipse web 项目目录结构以及Tomcat的各个目录的作用
    Eclipse导入git上的maven web项目 以及部署成功运行
    eclipse中怎么导入git库下载下来的web项目
    git和github的关系以及简单易懂的理解
    LINUX 怎么实现root和普通用户的切换及怎么更改root密码
  • 原文地址:https://www.cnblogs.com/xiu68/p/7988981.html
Copyright © 2020-2023  润新知