public class CurrencyConvertProblem{
public static int currencyConvert1(int[] arr,int aim){
return process(arr,0,aim);
}
public static int process(int[] arr,int index,int rest){
if(rest == 0){
return 1;
}
if(rest < 0 ){
return 0;
}
int sum = 0;
for (int i=index; i=0; index--) {
for (int rest=0; rest<=aim; rest++) {
dp[index][rest] = dp[index+1][rest]+
((rest-arr[index] >=0)?dp[index+1][rest-arr[index]]:0);
}
}
return dp[0][aim];
}
public static int currencyConvert5(int[] arr,int aim){
return process5(arr,0,aim);
}
public static int process5(int[] arr,int index,int rest){
if(rest == 0){
return 1;
}
int sum = 0;
for (int i=index; i=0;i++ ) {
sum+= process5(arr,i,rest-arr[i]);
}
return sum;
}
public static int currencyConvert6(int[] arr,int aim){
return process6(arr,0,aim);
}
public static int process6(int[] arr,int index,int rest){
if(index == arr.length){
return rest==0?1:0;
}
int sum = 0;
for (int i=0; i*arr[index]<=rest;i++ ) {
sum+= process6(arr,index+1,rest-(i*arr[index]));
}
return sum;
}
public static int currencyConvert7(int[] arr,int aim){
int N = arr.length;
int[][] dp=new int[N+1][aim+1];
for (int i=0;i<=N ; i++) {
dp[i][0] = 1;
}
for (int index=N-1; index>=0; index--) {
for (int rest=0; rest<=aim; rest++) {
int sum = 0;
for (int i=index; i=0;i++ ) {
sum+= dp[i][rest-arr[i]];
}
dp[index][rest] = sum;
}
}
for (int i=0; i<=N; i++) {
System.out.println();
for (int j=0; j<=aim; j++) {
System.out.print(dp[i][j]+",");
}
}
return dp[0][aim];
}
public static void main(String[] args){
int[] arr= new int[]{2,4,5,10};
int aim = 20;
//System.out.println("count = "+currencyConvert1(arr,aim));
//System.out.println("count = "+currencyConvert2(arr,aim));
System.out.println("count = "+currencyConvert3(arr,aim));
System.out.println("count = "+currencyConvert4(arr,aim));
System.out.println("count = "+currencyConvert5(arr,aim));
System.out.println("count = "+currencyConvert6(arr,aim));
//currencyConvert7é误
System.out.println("count = "+currencyConvert7(arr,aim));
}
}