Ways to sum to N using array elements with repetition allowed - GeeksforGeeks

01 Jun, 2021
Given a set of m distinct positive integers and a value ‘N’. The problem is to count the total number of ways we can form ‘N’ by doing sum of the array elements. Repetitions and different arrangements are allowed.Examples :  
Input : arr = {1, 5, 6}, N = 7
Output : 6

Explanation:- The different ways are:
1+1+1+1+1+1+1
1+1+5
1+5+1
5+1+1
1+6
6+1

Input : arr = {12, 3, 1, 9}, N = 14
Output : 150
 
Approach: The approach is based on the concept of dynamic programming.  
countWays(arr, m, N)
        Declare and initialize count[N + 1] = {0}
        count[0] = 1
        for i = 1 to N
            for j = 0 to m - 1
                if i >= arr[j]
                   count[i] += count[i - arr[j]]
        return count[N] 
Below is the implementation of above approach.  
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation to count ways// to sum up to a given value N#include <bits/stdc++.h> using namespace std; // function to count the total// number of ways to sum up to 'N'int countWays(int arr[], int m, int N){    int count[N + 1];    memset(count, 0, sizeof(count));         // base case    count[0] = 1;         // count ways for all values up    // to 'N' and store the result    for (int i = 1; i <= N; i++)        for (int j = 0; j < m; j++)             // if i >= arr[j] then            // accumulate count for value 'i' as            // ways to form value 'i-arr[j]'            if (i >= arr[j])                count[i] += count[i - arr[j]];         // required number of ways    return count[N];     } // Driver codeint main(){    int arr[] = {1, 5, 6};    int m = sizeof(arr) / sizeof(arr[0]);    int N = 7;    cout << "Total number of ways = "        << countWays(arr, m, N);    return 0;}
// Java implementation to count ways // to sum up to a given value N class Gfg{    static int arr[] = {1, 5, 6};         // method to count the total number    // of ways to sum up to 'N'    static int countWays(int N)    {        int count[] = new int[N + 1];                 // base case        count[0] = 1;                 // count ways for all values up        // to 'N' and store the result        for (int i = 1; i <= N; i++)            for (int j = 0; j < arr.length; j++)                     // if i >= arr[j] then                // accumulate count for value 'i' as                // ways to form value 'i-arr[j]'                if (i >= arr[j])                    count[i] += count[i - arr[j]];                 // required number of ways        return count[N];             }         // Driver code    public static void main(String[] args)    {        int N = 7;        System.out.println("Total number of ways = "                                    + countWays(N));    }}
# Python3 implementation to count# ways to sum up to a given value N # Function to count the total# number of ways to sum up to 'N'def countWays(arr, m, N):     count = [0 for i in range(N + 1)]         # base case    count[0] = 1         # Count ways for all values up    # to 'N' and store the result    for i in range(1, N + 1):        for j in range(m):             # if i >= arr[j] then            # accumulate count for value 'i' as            # ways to form value 'i-arr[j]'            if (i >= arr[j]):                count[i] += count[i - arr[j]]         # required number of ways    return count[N]     # Driver Codearr = [1, 5, 6]m = len(arr)N = 7print("Total number of ways = ",           countWays(arr, m, N))            # This code is contributed by Anant Agarwal.
// C# implementation to count ways // to sum up to a given value Nusing System; class Gfg{    static int []arr = {1, 5, 6};         // method to count the total number    // of ways to sum up to 'N'    static int countWays(int N)    {        int []count = new int[N+1];                 // base case        count[0] = 1;                 // count ways for all values up        // to 'N' and store the result        for (int i = 1; i <= N; i++)            for (int j = 0; j < arr.Length; j++)                     // if i >= arr[j] then                // accumulate count for value 'i' as                // ways to form value 'i-arr[j]'                if (i >= arr[j])                    count[i] += count[i - arr[j]];                 // required number of ways        return count[N];             }         // Driver code    public static void Main()    {        int N = 7;        Console.Write("Total number of ways = "                                    + countWays(N));    }} //This code is contributed by nitin mittal.
<?php// PHP implementation to count ways// to sum up to a given value N // function to count the total// number of ways to sum up to 'N'function countWays($arr, $m, $N){    $count = array_fill(0,$N + 1,0);         // base case    $count[0] = 1;         // count ways for all values up    // to 'N' and store the result    for ($i = 1; $i <= $N; $i++)        for ($j = 0; $j < $m; $j++)             // if i >= arr[j] then            // accumulate count for value 'i' as            // ways to form value 'i-arr[j]'            if ($i >= $arr[$j])                $count[$i] += $count[$i - $arr[$j]];         // required number of ways    return $count[$N];     } // Driver code$arr = array(1, 5, 6);$m =  count($arr);$N = 7;echo "Total number of ways = ",countWays($arr, $m, $N); // This code is contributed by Ryuga?>
<script>     // JavaScript implementation to count ways     // to sum up to a given value N         let arr = [1, 5, 6];           // method to count the total number    // of ways to sum up to 'N'    function countWays(N)    {        let count = new Array(N+1);        count.fill(0);                   // base case        count[0] = 1;                   // count ways for all values up        // to 'N' and store the result        for (let i = 1; i <= N; i++)            for (let j = 0; j < arr.length; j++)                       // if i >= arr[j] then                // accumulate count for value 'i' as                // ways to form value 'i-arr[j]'                if (i >= arr[j])                    count[i] += count[i - arr[j]];                   // required number of ways        return count[N];               }         let N = 7;      document.write("Total number of ways = " + countWays(N));     </script>
Output:  
Total number of ways = 6
Time Complexity: O(N*m)This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
ankthon
divyeshrabadiya07
Amazon
Arrays
Combinatorial
Dynamic Programming
Amazon
Arrays
Dynamic Programming
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Introduction to Arrays
Linked List vs Array
Python | Using 2D arrays/lists the right way
Given an array of size n and a number k, find all elements that appear more than n/k times
Queue | Set 1 (Introduction and Array Implementation)
Write a program to print all permutations of a given string
Permutation and Combination in Python
itertools.combinations() module in Python to print all possible combinations
Factorial of a large number
Program to calculate value of nCr