// program to make change in pennies, nickels, dimes
// 10/7/07 Cliff Stein


#include <stdio.h>
#define INFTY 100000

int min2(int x, int y)
{
  
  if (x <= y)  return x;
  return y;
}

int min3(int x, int y, int z)
{
  
  if ( (x <= y) && (x <= z) )
    return x;
  if ( (y < x) && (y < z))
    return y;
  else
    return z;
  
}
  
int change(n)
{
  
  if (n < 0)
    return  INFTY;
  else if (n == 0)
    return 0;
  else 
    return 1 + min3( change(n-1), change(n-5), change(n-10));
  
}

int dpchange(int n)
{
  
  int C[1000];
  int i,j;
  
  C[0] = 0;
  for (i=1; i<= n; i++) {
    
    if (i < 5)
      C[i] = 1+ C[i-1];
    else if (i < 10)
      C[i] = 1 + min2(C[i-1],C[i-5]);
    else 
      C[i] = 1 + min3(C[i-1],C[i-5],C[i-10]);
  }
  return C[n];
  
}


main()
{

  int n;
  
  printf("enter n - We will make change \n");
  scanf("%d", &n);


  printf("\n \nHit a key to begin the dynamic programming computation");
  getchar();getchar();
  printf("\n\n Number of coins needed is  %d\n",dpchange(n));


  printf("\n \nHit a key to begin the recursive computation");
  getchar();
  printf("\n\n Number of coins needed is  %d\n",change(n));
}
