Given two integers N and K, the task is to find the total number of ways of representing N as the sum of positive integers in the range [1, K], where each integer can be chosen multiple times.
Examples:
Input: N = 8, K = 2
Output: 5
Explanation: All possible ways of representing N as sum of positive integers less than or equal to K are:
- {1, 1, 1, 1, 1, 1, 1, 1}, the sum is 8.
- {2, 1, 1, 1, 1, 1, 1}, the sum is 8.
- {2, 2, 1, 1, 1, 1}, the sum is 8.
- 2, 2, 2, 1, 1}, the sum is 8.
- {2, 2, 2, 2}}, the sum is 8.
Therefore, the total number of ways is 5.
Input: N = 2, K = 2
Output: 2
Naive Approach: The simplest approach to solve the given problem is to generate all possible combinations of choosing integers over the range [1, K] and count those combinations whose sum is N.Â
Implementaion :Â
C++
| //C++ program for above approach  #include <bits/stdc++.h>usingnamespacestd;    // Function that return Ways to sum to N using// Natural Numbers up to K with repetitions allowedintNumberOfways(intN, intK) {    Â    // Base case    if(N == 0) return1;    if(N < 0 || K <= 0) return0;    Â    // including and not including K in sum    returnNumberOfways(N - K, K) + NumberOfways(N, K - 1);}    // Driver codeintmain() {    intN = 8;    intK = 2;    Â    // function call    cout << NumberOfways(N, K) << endl;    return0;}  // this code is contributed by bhardwajji | 
Java
| importjava.util.*;  classMain {    // Function that return Ways to sum to N using    // Natural Numbers up to K with repetitions allowed    publicstaticintNumberOfways(intN, intK)    {        // Base case        if(N == 0)            return1;        if(N < 0|| K <= 0)            return0;          // including and not including K in sum        returnNumberOfways(N - K, K)            + NumberOfways(N, K - 1);    }      // Driver code    publicstaticvoidmain(String[] args)    {        intN = 8;        intK = 2;          // function call        System.out.println(NumberOfways(N, K));    }} | 
Python3
| # Function that returns the number of ways to sum# to N using natural numbers up to K with repetitions allowed    defnumber_of_ways(N, K):      # Base case    ifN ==0:        return1    ifN < 0orK <=0:        return0      # Including and not including K in sum    returnnumber_of_ways(N -K, K) +number_of_ways(N, K -1)    # Driver codeif__name__ =='__main__':    N =8    K =2      # Function call    print(number_of_ways(N, K)) | 
Javascript
| // Function that return Ways to sum to N using// Natural Numbers up to K with repetitions allowedfunctionnumberOfWays(N, K) {    Â    // Base case    if(N == 0) return1;    if(N < 0 || K <= 0) return0;    Â    // including and not including K in sum    returnnumberOfWays(N - K, K) + numberOfWays(N, K - 1);}    // Driver codelet N = 8;let K = 2;    Â// function callconsole.log(numberOfWays(N, K)); | 
C#
| usingSystem;  classMainClass {    // Function that return Ways to sum to N using    // Natural Numbers up to K with repetitions allowed    staticintNumberOfWays(intN, intK)    {        // Base case        if(N == 0)            return1;        if(N < 0 || K <= 0)            return0;          // including and not including K in sum        returnNumberOfWays(N - K, K)            + NumberOfWays(N, K - 1);    }      // Driver code    staticvoidMain()    {        intN = 8;        intK = 2;          // function call        Console.WriteLine(NumberOfWays(N, K));    }}// This code is contributed by user_dtewbxkn77n | 
5
Time Complexity: O(KN)
Auxiliary Space: O(1)
Efficient Approach: The above approach has Overlapping Subproblems and an Optimal Substructure. Hence, in order to optimize, Dynamic Programming is needed to be performed based on the following observations:
- Considering dp[i] stores the total number of ways for representing i as the sum of integers lying in the range [1, K], then the transition of states can be defined as:
- For i in the range [1, K] and for every j in the range [1, N]
- The value of dp[j] is equal to (dp[j]+ dp[j – i]), for all j ? i.
 
Follow the steps below to solve the problem:
- Initialize an array, say dp[], with all elements as 0, to store all the recursive states.
- Initialize dp[0] as 1.
- Now, iterate over the range [1, K] using a variable i and perform the following steps: 
- Iterate over the range [1, N], using a variable j, and update the value of dp[j] as dp[j]+ dp[j – i], if j ? i.
 
- After completing the above steps, print the value of dp[N] as the result.
Below is the implementation of the above approach:
C++
| // C++ program for the above approach#include <bits/stdc++.h>usingnamespacestd;  // Function to find the total number of// ways to represent N as the sum of// integers over the range [1, K]intNumberOfways(intN, intK){      // Initialize a list    vector<int> dp(N + 1, 0);  Â    // Update dp[0] to 1    dp[0] = 1;      // Iterate over the range [1, K + 1]    for(introw = 1; row < K + 1; row++)    {          // Iterate over the range [1, N + 1]        for(intcol = 1; col < N + 1; col++)        {              // If col is greater            // than or equal to row            if(col >= row)              Â                // Update current                // dp[col] state                dp[col] = dp[col] + dp[col - row];          }    }      // Return the total number of ways    return(dp[N]);}  // Driver Codeintmain(){  intN = 8;  intK = 2;    cout << (NumberOfways(N, K));}  // This code is contributed by mohit kumar 29. | 
Java
| // Java program for the above approachimportjava.util.*;  classGFG{    Â// Function to find the total number of// ways to represent N as the sum of// integers over the range [1, K]staticintNumberOfways(intN, intK){    Â    // Initialize a list    int[] dp = newint[N + 1];  Â    // Update dp[0] to 1    dp[0] = 1;      // Iterate over the range [1, K + 1]    for(introw = 1; row < K + 1; row++)    {          // Iterate over the range [1, N + 1]        for(intcol = 1; col < N + 1; col++)        {            Â            // If col is greater            // than or equal to row            if(col >= row)              Â                // Update current                // dp[col] state                dp[col] = dp[col] + dp[col - row];          }    }      // Return the total number of ways    return(dp[N]);}  // Driver codepublicstaticvoidmain(String[] args){    Â    // Given inputs    intN = 8;    intK = 2;    Â    System.out.println(NumberOfways(N, K));}}  // This code is contributed by offbeat | 
Python
| # Python program for the above approach  # Function to find the total number of# ways to represent N as the sum of# integers over the range [1, K]defNumberOfways(N, K):  Â    # Initialize a list    dp =[0] *(N +1)    Â    # Update dp[0] to 1    dp[0] =1    Â    # Iterate over the range [1, K + 1]    forrow inrange(1, K +1):      Â        # Iterate over the range [1, N + 1]        forcol inrange(1, N +1):          Â            # If col is greater            # than or equal to row            if(col >=row):              Â                # Update current                # dp[col] state                dp[col] =dp[col] +dp[col -row]                Â                Â    # Return the total number of ways    return(dp[N])  # Driver Code  N =8K =2  print(NumberOfways(N, K)) | 
Javascript
| <script>// Javascript implementation for the above approach  // Function to find the total number of// ways to represent N as the sum of// integers over the range [1, K]functionNumberOfways(N, K){    Â    // Initialize a list    let dp = Array.from({length: N +1}, (_, i) => 0);  Â    // Update dp[0] to 1    dp[0] = 1;      // Iterate over the range [1, K + 1]    for(let row = 1; row < K + 1; row++)    {          // Iterate over the range [1, N + 1]        for(let col = 1; col < N + 1; col++)        {            Â            // If col is greater            // than or equal to row            if(col >= row)              Â                // Update current                // dp[col] state                dp[col] = dp[col] + dp[col - row];          }    }      // Return the total number of ways    return(dp[N]);}      // Driver Code    Â    // Given inputs    let N = 8;    let K = 2;    Â    document.write(NumberOfways(N, K));  </script> | 
C#
| // C# program for the above approachusingSystem;classGFG {  Â    // Function to find the total number of    // ways to represent N as the sum of    // integers over the range [1, K]    staticintNumberOfways(intN, intK)    {          // Initialize a list        int[] dp = newint[(N + 1)];          // Update dp[0] to 1        dp[0] = 1;          // Iterate over the range [1, K + 1]        for(introw = 1; row < K + 1; row++) {              // Iterate over the range [1, N + 1]            for(intcol = 1; col < N + 1; col++) {                  // If col is greater                // than or equal to row                if(col >= row)                      // Update current                    // dp[col] state                    dp[col] = dp[col] + dp[col - row];            }        }          // Return the total number of ways        return(dp[N]);    }      // Driver Code    publicstaticvoidMain()    {        intN = 8;        intK = 2;          Console.WriteLine(NumberOfways(N, K));    }}  // This code is contributed by ukasp. | 
5
Â
Time Complexity: O(N * K)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

 
                                    







