import org.junit.Test;
public class solution {
@Test
public void testFunc(){
int[] arr = {5,2,3};
int target =20;
int res = charge(arr, target);
System.out.println("res: "+res);
}
/*
* coin change
* 给定数组arr,arr中所有的值都为正数且重复。
* 每个值代表一种面值的货币,每种面值的货币可以使用任意张,
* 再给定一个整数aim代表要找的钱数,求换钱有多少种方法。
*/
public int charge(int[] w, int target){
return minValue(w, 0, target);
}
public int minValue(int[] w, int index, int c){
if (c==0) {
return 0;
}
if (index<w.length && c>0) {
int count = c/w[index];
int minCost = Integer.MAX_VALUE;
for(int i=0;i<=count;i++){
int res = minValue(w, index+1, c-w[index]*i);
if (res!=-1) {
minCost = Math.min(res+i, minCost);
}
}
return (minCost==Integer.MAX_VALUE)?-1:minCost;
}
return -1;
}
}
public class solution {
@Test
public void testFunc(){
int[] arr = {5,2,3};
int target =20;
int res = charge(arr, target);
System.out.println("res: "+res);
}
/*
* coin change
* 给定数组arr,arr中所有的值都为正数且重复。
* 每个值代表一种面值的货币,每种面值的货币可以使用任意张,
* 再给定一个整数aim代表要找的钱数,求换钱有多少种方法。
*/
public int charge(int[] w, int target){
return minValue(w, 0, target);
}
public int minValue(int[] w, int index, int c){
if (c==0) {
return 0;
}
if (index<w.length && c>0) {
int count = c/w[index];
int minCost = Integer.MAX_VALUE;
for(int i=0;i<=count;i++){
int res = minValue(w, index+1, c-w[index]*i);
if (res!=-1) {
minCost = Math.min(res+i, minCost);
}
}
return (minCost==Integer.MAX_VALUE)?-1:minCost;
}
return -1;
}
}