Coin Change

public:
    long long int getWays(int S[], int m, int n,
                            vector<vector<long long int>> &savedWays) {
                      
        // using no coins, no way to make any amount.       
        if(m <= 0)
            return 0;
            
        // to make 0 amount, 1 way, use no coins.
        if(n == 0)
            return 1;
        // to make -ve amount, no way.
        if(n < 0)
            return 0;
            
        // if saved result then return.
        if(savedWays[m][n])
            return savedWays[m][n];
        
        // try making amount with every coin.
        long long int ways = 0;    
        for(int i = m - 1; i >= 0; i--)
            ways += getWays(S, i + 1, n - S[i], savedWays);
            
        return savedWays[m][n] = ways;
        
    }

    long long int count(int S[], int m, int n) {
        vector<vector<long long int>> savedWays(m + 1, 
                                        vector<long long int>(n + 1));
        return getWays(S, m, n, savedWays);
        // code here.
    }
};

Last updated