public class MoneyWays {
/**
* 面值为:3,5,7,1 f
* 每个面值可以用无数张
* 100
* 从左往右尝试
* f(index,res)
* 0张3元的 f(index+1,res)+
* 1张3元的 f(index+1,res-3*1)+
* 33........f(index+1,res-3*33)+
*/
public int moneyWays(int[] arr,int aim){
if(arr==null||arr.length==0||aim<0){
return -1;
}
return process(arr,0,aim);
}
public int process(int[] arr,int index,int res){
//base case 无面值的时候
if(index==arr.length){
//到最后了,有没有组成目标值
return res==0?1:0;
}
int ways=0;
for(int zhang=0;zhang*arr[index]<=res;zhang++){
ways+=process(arr,index+1,res-zhang*arr[index]);
}
return ways;
}
}