Last Updated: 27 Jul, 2020

Ways To Make Coin Change

Moderate
Asked in companies
MicrosoftHSBCOracle

Problem statement

You are given an infinite supply of coins of each of denominations D = {D0, D1, D2, D3, ...... Dn-1}. You need to figure out the total number of ways W, in which you can make a change for value V using coins of denominations from D. Print 0, if a change isn't possible.

Input Format
The first line of input contains an integer N, representing the total number of denominations.

The second line of input contains N integers values separated by a single space. Each integer value represents the denomination value.

The third line of input contains the value of V, representing the value for which the change needs to be generated.
Output Format:
For each test case, print an integer denoting the total number of ways W, in which a change for V is possible.
Note:
You do not need to print anything, it has already been taken care of. Just implement the given function.

Constraints :

1 <= N <= 10
1 <= D[i] <=10^5
1 <= V <= 2 * 10^3

Where 'D[i]' represent the value of ith denomination. 

Time Limit: 1sec

Approaches

01 Approach

 

  1. The idea is to use recursion.
  2. For a particular coin, we have two options either include it or exclude it.
  3. If we include that coin, then calculate the remaining number that we have to generate so recur for that remaining number.
  4. If we exclude that coin, then recur for the same amount that we have to make.
  5. Our final answer would be the total number of ways either by including or excluding.
  6. There will be two edge cases in recursion that are: if the total amount we have is zero then return 1 (solution found) and if the total amount we have become negative or no elements are left then return zero that is if (n < 0 || value < 0) then return 0.

02 Approach

  1. The idea is to use recursion and memoization. So first create a 2D array 'memo' that will store the answer of all subproblems that we compute.
  2. For a particular coin, if the answer is already present in the map, then just return it.
  3. Otherwise, we have two options either include it or exclude it.
  4. If we include that coin, then calculate the remaining number that we have to generate so recur for that remaining number.
  5. If we exclude that coin, then recur for the same amount that we have to make.
  6. Our final answer would be the total number of ways either by including or excluding.
  7. Store the answer on the map before returning.

03 Approach

  1. The idea is to use dynamic programming.
  2. Create a two-dimensional array, ‘ways’,  where ‘ways[i][j]’ will denote the total number of ways to make j value by using i coins.
  3. Fill dp array by the recurrence relation as follows:

                  ways[i][j] = ways[i-1][j] + ways[i][j-denominations[i]]

           Where first term represents that we have excluded that coin and,

           Second term represents that we have included that coin.

04 Approach

  1. The idea is to use dynamic programming
  2. As by recurrence relation of previous approach, we can easily see that it is only dependent on previous row, so we can optimise the space complexity
  3. Create a one-dimensional array and run a nested loop
  4. So dp[i] will be storing the number of solutions for value i