#include #include #include using namespace std; int values[] = { 1, 5, 10, 25 }; int answers[10000][4]; int ways(int amount, int last_usable /* starts off as 3 */) { if (amount == 0) return 1; // the result is the empty set of coins, that's still a valid solution if (last_usable < 0) return 0; if (answers[amount][last_usable] != -1) return answers[amount][last_usable]; int result; if (amount < values[last_usable]) // can't use that coin at all, it is too big result = ways(amount, last_usable - 1); else { int n1 = ways(amount - values[last_usable], last_usable); int n2 = ways(amount, last_usable - 1); result = n1 + n2; } answers[amount][last_usable] = result; return result; } int main(int argc, char * argv[]) { for (int r = 0; r < 10000; r += 1) for (int c = 0; c < 4; c += 1) answers[r][c] = -1; cout << ways(atoi(argv[1]), 3) << "\n"; }