1. 程式人生 > >Ex 6_19 至多用k枚硬幣兌換價格_第七次作業

Ex 6_19 至多用k枚硬幣兌換價格_第七次作業

alt .com pre 順序 ring chan out spa spl

技術分享圖片

子問題定義: 定義一個二維數組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 }
View Code

Ex 6_19 至多用k枚硬幣兌換價格_第七次作業