# Print all possible K-length subsequences of first N natural numbers with sum N

• Difficulty Level : Hard
• Last Updated : 04 Apr, 2022

Given two positive integers N and K, the task is to print all possible K-length subsequences from first N natural numbers whose sum of elements is equal to N.

Examples:

Input: N = 5, K = 3
Output: { {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {2, 1, 2}, {2, 2, 1}, {3, 1, 1} }
Explanation:
1 + 1 + 3 = N(= 5) and length is K(= 3)
1 + 2 + 2 = N(= 5) and length is K(= 3)
1 + 3 + 1 = N(= 5) and length is K(= 3)
2 + 1 + 2 = N(= 5) and length is K(= 3)
2 + 2 + 1 = N(= 5) and length is K(= 3)
3 + 1 + 1 = N(= 5) and length is K(= 3)

Input: N = 3, K = 3
Output: { {1, 1, 1} }

Approach: The problem can be solved using backtracking technique. Below is the recurrence relation: Follow the steps below to solve the problem:

• Initialize a 2D array say, res[][] to store all possible subsequences of length K whose sum is equal to N.
• Use the above recurrence relation and find all possible subsequences of length K whose sum is equal to N.
• Finally, print the res[][] array.

Below is the implementation of the above approach:

## C++

 // C++ program to implement// the above approach #include using namespace std; // Function to print all subsequences of length// K from N natural numbers whose sum equal to Nvoid findSub(vector >& res, int sum,             int K, int N, vector<int>& temp){     // Base case    if (K == 0 && sum == 0) {        res.push_back(temp);        return;    }    if (sum <= 0 || K <= 0) {        return;    }     // Iterate over the range [1, N]    for (int i = 1; i <= N; i++) {         // Insert i into temp        temp.push_back(i);        findSub(res, sum - i, K - 1, N, temp);         // Pop i from temp        temp.pop_back();    }} // Utility function to print all subsequences// of length K with sum equal to Nvoid UtilPrintSubsequncesOfKSumN(int N, int K){     // Store all subsequences of length K    // from N natural numbers    vector > res;     // Store current subsequence of    // length K from N natural numbers    vector<int> temp;     findSub(res, N, K, N, temp);     // Stores total count    // of subsequences    int sz = res.size();     // Print all subsequences    cout << "{ ";     // Traverse all subsequences    for (int i = 0; i < sz; i++) {         cout << "{ ";         // Print current subsequence        for (int j = 0; j < K; j++) {             // If current element is last            // element of subsequence            if (j == K - 1)                cout << res[i][j] << " ";            else                cout << res[i][j] << ", ";        }         // If current subsequence is last        // subsequence from n natural numbers        if (i == sz - 1)            cout << "}";        else            cout << "}, ";    }    cout << " }";} // Driver Codeint main(){     int N = 4;    int K = 2;    UtilPrintSubsequncesOfKSumN(N, K);}

## Java

 // Java program to implement// the above approachimport java.io.*;import java.util.*;import java.util.stream.Collectors; class GFG {   // Function to print all subsequences of length  // K from N natural numbers whose sum equal to N  static void findSub(List > res, int sum,                      int K, int N, List temp)  {     // Base case    if (K == 0 && sum == 0) {      List newList = temp.stream().collect(        Collectors.toList());      res.add(newList);      return;    }    if (sum <= 0 || K <= 0) {      return;    }     // Iterate over the range [1, N]    for (int i = 1; i <= N; i++) {       // Insert i into temp      temp.add(i);      findSub(res, sum - i, K - 1, N, temp);       // Pop i from temp      temp.remove(temp.size() - 1);    }  }   // Utility function to print all subsequences  // of length K with sum equal to N  static void UtilPrintSubsequncesOfKSumN(int N, int K)  {     // Store all subsequences of length K    // from N natural numbers    @SuppressWarnings("unchecked")    List > res = new ArrayList();     // Store current subsequence of    // length K from N natural numbers    @SuppressWarnings("unchecked")    List temp = new ArrayList();     findSub(res, N, K, N, temp);     // Stores total count    // of subsequences    int sz = res.size();     // Print all subsequences    System.out.print("{ ");     // Traverse all subsequences    for (int i = 0; i < sz; i++) {       System.out.print("{ ");       // Print current subsequence      for (int j = 0; j < K; j++) {         // If current element is last        // element of subsequence        if (j == K - 1)          System.out.print(res.get(i).get(j)                           + " ");        else          System.out.print(res.get(i).get(j)                           + ", ");      }       // If current subsequence is last      // subsequence from n natural numbers      if (i == sz - 1)        System.out.print("}");      else        System.out.print("}, ");    }    System.out.print(" }");  }   // Driver code  public static void main(String[] args)  {    int N = 4;    int K = 2;    UtilPrintSubsequncesOfKSumN(N, K);  }} // This code is contributed by jithin.

## Python3

 # Python program to implement# the above approach  # Function to print all subsequences of length# K from N natural numbers whose sum equal to Ndef findSub(res,sum,K,N,temp):     # Base case    if (K == 0 and sum == 0):        res.append(temp[:])        return     if (sum <= 0 or K <= 0):        return     # Iterate over the range [1, N]    for i in range(1,N):         # Insert i into temp        temp.append(i)        findSub(res, sum - i, K - 1, N, temp)         # Pop i from temp        temp.pop() # Utility function to print all subsequences# of length K with sum equal to Ndef UtilPrintSubsequncesOfKSumN(N, K):     # Store all subsequences of length K    # from N natural numbers    res = []     # Store current subsequence of    # length K from N natural numbers    temp = []     findSub(res, N, K, N, temp)         # # Stores total count    # # of subsequences    sz = len(res)     # Print all subsequences    print("{",end=" ")     # Traverse all subsequences    for i in range(sz):         print("{",end=" ")         # Print current subsequence        for j in range(K):             # If current element is last            # element of subsequence            if (j == K - 1):                print(res[i][j],end=" ")            else:                print(res[i][j],end = ", ")         # If current subsequence is last        # subsequence from n natural numbers        if (i == sz - 1):            print("}",end="")        else:            print("},",end =" ")    print(" }") # Driver CodeN = 4K = 2UtilPrintSubsequncesOfKSumN(N, K) # This code is contributed by shinjanpatra

Output:

{ { 1, 3 }, { 2, 2 }, { 3, 1 } }

Time Complexity: O(2N)
Auxiliary Space: O(X), where X denotes the count of subsequences of length K whose sum is N

My Personal Notes arrow_drop_up