class CoinChange { static int D[] = { 1, 5, 10, 25}; static int cc1 (int s, int n) { if (s < 0) return 0; if (s == 0) return 1; if (n == 0) return 0; return cc1 (s, n-1) + cc1 (s-D[n-1], n); } static int Table[][]; static int cc2 (int s, int n) { int i, j; Table = new int[s+1][n]; for (i = 0; i <= s; i++) { for (j = 0; j < n; j++) { Table[i][j] = -1; } } return cc2_aux (s, n); } static int cc2_aux (int s, int n) { int ans; if (s < 0) return 0; if (s == 0) return 1; if (n == 0) return 0; if (Table[s][n-1] >= 0) return Table[s][n-1]; ans = cc2_aux (s, n-1) + cc2_aux (s-D[n-1], n); Table[s][n-1] = ans; return ans; } public static void main (String [] args) { int s = Integer.parseInt (args[0]); Out.println ("cc1(" + s + ") = " + cc1(s, 4)); Out.println ("cc2(" + s + ") = " + cc2(s, 4)); } }