# Number of ways to sum up a total of N from limited denominations

Given a number N and two arrays arr1[] and arr2[] of length 4. The array arr1[] denotes the denomination of 1, 5, 10, and 20 and arr2[] denotes the count of denominations of 1, 5, 10, and 20 respectively. The task is to find the number of ways in which we can sum them up to a total of N with the limited number of denominations.
Examples:

Input: arr1[] = {1, 5, 10, 20}, arr2[] = {6, 4, 3, 5}, N = 123
Output:
Explanation:
There are 5 ways to sum up to 123 with the given denomination of coins.

Input: arr1[] = {1, 5, 10, 20}, arr2[] = {1, 3, 2, 1}, N = 50
Output:
Explanation:
There is only 1 way to sum up to 50 with the given denomination of coins.

Naive Approach: Let the count of denominations be represented by A, B, C, and D. The naive approach is to run nested loops. Each loop will refer to the number of coins of each denomination. Find the number of coins of each denomination required to make N by the equation:

(a * 1) + (b * 5) + (c * 10) + (d * 20)) == N
where 0 <= a <= A, 0 &<= b <= B, 0 <= c <= C, 0 <= d <= D and N is the total amount.

Time Complexity: O(N4
Auxiliary Space: O(1)

Better Approach: We can optimize the above naive approach by adding some extra bounds to the loops which will reduce some computations. By observing, we can easily reduce the complexity by discarding one loop by removing coin with denomination 1 from N and check if below inequality holds true or not:

(N – A) <= (b * 5 + c * 10 + d * 20) <= N

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach ` `#include ` `using` `namespace` `std; ` ` `  `// Function to find the number of ` `// ways to sum up a total of N ` `// from limited denominations ` `int` `calculateWays(``int` `arr1[], ``int` `arr2[], ` `                  ``int` `N) ` `{ ` `    ``// Store the count of denominations ` `    ``int` `A = arr2, B = arr2; ` `    ``int` `C = arr2, D = arr2; ` ` `  `    ``// Stores the final result ` `    ``int` `ans = 0; ` ` `  `    ``// As one of the denominations is ` `    ``// rupee 1, so we can reduce the ` `    ``// computation by checking the ` `    ``// equality for N-(A*1) = N-A ` `    ``for` `(``int` `b = 0; ` `         ``b <= B && b * 5 <= (N); b++) ` ` `  `        ``for` `(``int` `c = 0; ` `             ``c <= C ` `             ``&& b * 5 + c * 10 <= (N); ` `             ``c++) ` ` `  `            ``for` `(``int` `d = 0; ` `                 ``d <= D ` `                 ``&& b * 5 + c * 10 + d * 20 <= (N); ` `                 ``d++) ` ` `  `                ``if` `((b * 5) + (c * 10) ` `                        ``+ (d * 20) ` `                    ``>= (N - A)) ` ` `  `                    ``// Increment the count ` `                    ``// for number of ways ` `                    ``ans++; ` `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``// Given Denominations ` `    ``int` `N = 123; ` ` `  `    ``int` `arr1[] = { 1, 5, 10, 20 }; ` `    ``int` `arr2[] = { 6, 4, 3, 5 }; ` ` `  `    ``// Function Call ` `    ``cout << calculateWays(arr1, arr2, N); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program for the above approach ` `import` `java.util.*; ` ` `  `class` `GFG{ ` ` `  `// Function to find the number of ` `// ways to sum up a total of N ` `// from limited denominations ` `static` `int` `calculateWays(``int` `arr1[], ``int` `arr2[], ` `                         ``int` `N) ` `{ ` `     `  `    ``// Store the count of denominations ` `    ``int` `A = arr2[``0``], B = arr2[``1``]; ` `    ``int` `C = arr2[``2``], D = arr2[``3``]; ` ` `  `    ``// Stores the final result ` `    ``int` `ans = ``0``; ` ` `  `    ``// As one of the denominations is ` `    ``// rupee 1, so we can reduce the ` `    ``// computation by checking the ` `    ``// equality for N-(A*1) = N-A ` `    ``for``(``int` `b = ``0``; ` `            ``b <= B && b * ``5` `<= (N); b++) ` `             `  `        ``for``(``int` `c = ``0``; ` `                ``c <= C && b * ``5` `+ c * ``10` `<= (N); ` `                ``c++) ` ` `  `            ``for``(``int` `d = ``0``; ` `                    ``d <= D &&  ` `                    ``b * ``5` `+ c * ``10` `+ d * ``20` `<= (N); ` `                    ``d++) ` ` `  `                ``if` `((b * ``5``) + (c * ``10``) + ` `                    ``(d * ``20``) >= (N - A)) ` ` `  `                    ``// Increment the count ` `                    ``// for number of ways ` `                    ``ans++; ` `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` `     `  `    ``// Given denominations ` `    ``int` `N = ``123``; ` ` `  `    ``int` `arr1[] = { ``1``, ``5``, ``10``, ``20` `}; ` `    ``int` `arr2[] = { ``6``, ``4``, ``3``, ``5` `}; ` ` `  `    ``// Function call ` `    ``System.out.print(calculateWays(arr1, arr2, N)); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992`

## Python3

 `# Python3 program for the above approach ` ` `  `# Function to find the number of ` `# ways to sum up a total of N ` `# from limited denominations ` `def` `calculateWays(arr1, arr2, N): ` `   `  `    ``# Store the count of denominations ` `    ``A ``=` `arr2[``0``] ` `    ``B ``=` `arr2[``1``] ` `    ``C ``=` `arr2[``2``] ` `    ``D ``=` `arr2[``3``] ` ` `  `    ``# Stores the final result ` `    ``ans, b, c, d ``=` `0``, ``0``, ``0``, ``0` ` `  `    ``# As one of the denominations is ` `    ``# rupee 1, so we can reduce the ` `    ``# computation by checking the ` `    ``# equality for N-(A*1) = N-A ` `    ``while` `b <``=` `B ``and` `b ``*` `5` `<``=` `(N): ` `        ``c ``=` `0` ` `  `        ``while` `(c <``=` `C ``and`  `               ``b ``*` `5` `+` `c ``*` `10` `<``=` `(N)): ` `            ``d ``=` `0` ` `  `            ``while` `(d <``=` `D ``and` `                   ``b ``*` `5` `+` `c ``*` `10` `+` `                   ``d ``*` `20` `<``=` `(N)): ` `               `  `                ``if` `((b ``*` `5``) ``+` `(c ``*` `10``) ``+`  `                    ``(d ``*` `20``) >``=` `(N ``-` `A)): ` ` `  `                    ``# Increment the count ` `                    ``# for number of ways ` `                    ``ans ``+``=` `1` `                ``d ``+``=` `1` `            ``c ``+``=` `1` `        ``b ``+``=` `1` `         `  `    ``return` `ans ` `   `  `# Driver Code ` `if` `__name__ ``=``=` `'__main__'``: ` `   `  `    ``# Given Denominations ` `    ``N ``=` `123` ` `  `    ``arr1 ``=` `[ ``1``, ``5``, ``10``, ``20` `] ` `    ``arr2 ``=` `[ ``6``, ``4``, ``3``, ``5` `] ` ` `  `    ``# Function Call ` `    ``print``(calculateWays(arr1, arr2, N)) ` ` `  `# This code is contributed by mohit kumar 29`

## C#

 `// C# program for the above approach ` `using` `System; ` ` `  `class` `GFG{ ` ` `  `// Function to find the number of ` `// ways to sum up a total of N ` `// from limited denominations ` `static` `int` `calculateWays(``int` `[]arr1, ``int` `[]arr2, ` `                         ``int` `N) ` `{ ` `     `  `    ``// Store the count of denominations ` `    ``int` `A = arr2, B = arr2; ` `    ``int` `C = arr2, D = arr2; ` ` `  `    ``// Stores the readonly result ` `    ``int` `ans = 0; ` ` `  `    ``// As one of the denominations is ` `    ``// rupee 1, so we can reduce the ` `    ``// computation by checking the ` `    ``// equality for N-(A*1) = N-A ` `    ``for``(``int` `b = 0; ` `            ``b <= B && b * 5 <= (N); b++) ` `             `  `        ``for``(``int` `c = 0; ` `                ``c <= C && b * 5 + c * 10 <= (N); ` `                ``c++) ` ` `  `            ``for``(``int` `d = 0; ` `                    ``d <= D &&  ` `                    ``b * 5 + c * 10 + d * 20 <= (N); ` `                    ``d++) ` ` `  `                ``if` `((b * 5) + (c * 10) + ` `                    ``(d * 20) >= (N - A)) ` ` `  `                    ``// Increment the count ` `                    ``// for number of ways ` `                    ``ans++; ` `                     `  `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `Main(String[] args) ` `{ ` `     `  `    ``// Given denominations ` `    ``int` `N = 123; ` ` `  `    ``int` `[]arr1 = { 1, 5, 10, 20 }; ` `    ``int` `[]arr2 = { 6, 4, 3, 5 }; ` ` `  `    ``// Function call ` `    ``Console.Write(calculateWays(arr1, arr2, N)); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

Output:

```5
```

Time Complexity: O(N3
Auxiliary Space: O(1)

Efficient Approach: Let the count of denominations be represented by A, B, C, and D. The efficient approach for solving the above problem is to count the possible number of denominations formed using C and D. Then we will find the remaining value with denominations of A and B. Below are the steps:

1. Initialize the array ways[] to store the precomputed sum of denominations of A and B.
2. Iterate two nested loops to store the combination of values formed by denominations of A and B in ways[].
3. Iterate two nested loops to find all the combination of values formed by denominations of C and D and add all the possible combinations of the value N – (C*10 + D*20), which is equivalent to (A * 1) + (B * 5).
4. The sum of all values in the above step is the required result.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach ` `#include ` `using` `namespace` `std; ` `int` `ways; ` ` `  `// Function to find the number of ` `// ways to sum up a total of N ` `// from limited denominations ` `int` `calculateWays(``int` `arr1[], ``int` `arr2[], ` `                  ``int` `N) ` `{ ` `    ``// Store the count of denominations ` `    ``int` `A = arr2, B = arr2; ` `    ``int` `C = arr2, D = arr2; ` ` `  `    ``// Stores the final result ` `    ``int` `ans = 0; ` ` `  `    ``// L1 : Incrementing the values ` `    ``// with indices with denomination ` `    ``// (a * 1 + b * 5) ` ` `  `    ``// This will give the number of coins ` `    ``// for all combinations of coins ` `    ``// with value 1 and 5 ` `    ``for` `(``int` `b = 0; ` `         ``b <= B && b * 5 <= N; b++) { ` ` `  `        ``for` `(``int` `a = 0; ` `             ``a <= A ` `             ``&& a * 1 + b * 5 <= N; ` `             ``a++) { ` `            ``ways[a + b * 5]++; ` `        ``} ` `    ``} ` ` `  `    ``// L2 will sum the values of those ` `    ``// indices of ways[] which is equal ` `    ``// to (N - (c * 10 + d * 20)) ` `    ``for` `(``int` `c = 0; ` `         ``c <= C && c * 10 <= (N); c++) { ` ` `  `        ``for` `(``int` `d = 0; ` `             ``d <= D ` `             ``&& c * 10 + d * 20 <= (N); ` `             ``d++) { ` `            ``ans += ways[N - c * 10 - d * 20]; ` `        ``} ` `    ``} ` ` `  `    ``// Return the final count ` `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``// Given Denominations ` `    ``int` `N = 123; ` ` `  `    ``int` `arr1[] = { 1, 5, 10, 20 }; ` `    ``int` `arr2[] = { 6, 4, 3, 5 }; ` ` `  `    ``// Function Call ` `    ``cout << calculateWays(arr1, arr2, N); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program for the above approach ` `import` `java.util.*; ` ` `  `class` `GFG{ ` `     `  `static` `int` `[]ways = ``new` `int``[``1010``]; ` ` `  `// Function to find the number of ` `// ways to sum up a total of N ` `// from limited denominations ` `static` `int` `calculateWays(``int` `arr1[], ``int` `arr2[], ` `                         ``int` `N) ` `{ ` `     `  `    ``// Store the count of denominations ` `    ``int` `A = arr2[``0``], B = arr2[``1``]; ` `    ``int` `C = arr2[``2``], D = arr2[``3``]; ` ` `  `    ``// Stores the final result ` `    ``int` `ans = ``0``; ` ` `  `    ``// L1 : Incrementing the values ` `    ``// with indices with denomination ` `    ``// (a * 1 + b * 5) ` ` `  `    ``// This will give the number of coins ` `    ``// for all combinations of coins ` `    ``// with value 1 and 5 ` `    ``for``(``int` `b = ``0``;  ` `            ``b <= B && b * ``5` `<= N; b++)  ` `    ``{ ` `        ``for``(``int` `a = ``0``;  ` `                ``a <= A && a * ``1` `+ b * ``5` `<= N; ` `                ``a++)  ` `        ``{ ` `            ``ways[a + b * ``5``]++; ` `        ``} ` `    ``} ` ` `  `    ``// L2 will sum the values of those ` `    ``// indices of ways[] which is equal ` `    ``// to (N - (c * 10 + d * 20)) ` `    ``for``(``int` `c = ``0``;  ` `            ``c <= C && c * ``10` `<= (N); c++)  ` `    ``{ ` `        ``for``(``int` `d = ``0``;  ` `                ``d <= D && c * ``10` `+ d * ``20` `<= (N); ` `                ``d++)  ` `        ``{ ` `            ``ans += ways[N - c * ``10` `- d * ``20``]; ` `        ``} ` `    ``} ` ` `  `    ``// Return the final count ` `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` `     `  `    ``// Given denominations ` `    ``int` `N = ``123``; ` ` `  `    ``int` `arr1[] = { ``1``, ``5``, ``10``, ``20` `}; ` `    ``int` `arr2[] = { ``6``, ``4``, ``3``, ``5` `}; ` ` `  `    ``// Function call ` `    ``System.out.print(calculateWays(arr1, arr2, N)); ` `} ` `} ` ` `  `// This code is contributed by Princi Singh `

## C#

 `// C# program for the above approach ` `using` `System; ` ` `  `class` `GFG{ ` `     `  `static` `int` `[]ways = ``new` `int``; ` ` `  `// Function to find the number of ` `// ways to sum up a total of N ` `// from limited denominations ` `static` `int` `calculateWays(``int` `[]arr1, ``int` `[]arr2, ` `                         ``int` `N) ` `{ ` `     `  `    ``// Store the count of denominations ` `    ``int` `A = arr2, B = arr2; ` `    ``int` `C = arr2, D = arr2; ` ` `  `    ``// Stores the readonly result ` `    ``int` `ans = 0; ` ` `  `    ``// L1 : Incrementing the values ` `    ``// with indices with denomination ` `    ``// (a * 1 + b * 5) ` ` `  `    ``// This will give the number of coins ` `    ``// for all combinations of coins ` `    ``// with value 1 and 5 ` `    ``for``(``int` `b = 0;  ` `            ``b <= B && b * 5 <= N; b++)  ` `    ``{ ` `        ``for``(``int` `a = 0;  ` `                ``a <= A && a * 1 + b * 5 <= N; ` `                ``a++)  ` `        ``{ ` `            ``ways[a + b * 5]++; ` `        ``} ` `    ``} ` ` `  `    ``// L2 will sum the values of those ` `    ``// indices of ways[] which is equal ` `    ``// to (N - (c * 10 + d * 20)) ` `    ``for``(``int` `c = 0;  ` `            ``c <= C && c * 10 <= (N); c++)  ` `    ``{ ` `        ``for``(``int` `d = 0;  ` `                ``d <= D && c * 10 + d * 20 <= (N); ` `                ``d++)  ` `        ``{ ` `            ``ans += ways[N - c * 10 - d * 20]; ` `        ``} ` `    ``} ` ` `  `    ``// Return the final count ` `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `Main(String[] args) ` `{ ` `     `  `    ``// Given denominations ` `    ``int` `N = 123; ` ` `  `    ``int` `[]arr1 = { 1, 5, 10, 20 }; ` `    ``int` `[]arr2 = { 6, 4, 3, 5 }; ` ` `  `    ``// Function call ` `    ``Console.Write(calculateWays(arr1, arr2, N)); ` `} ` `} ` ` `  `// This code is contributed by 29AjayKumar `

Output:

```5
```

Time Complexity: O(N2)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.