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

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} }

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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++ 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 N  void 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 N  void 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 << "{ ";         // Treaverse 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 Code  int main()  {         int N = 4;      int K = 2;      UtilPrintSubsequncesOfKSumN(N, K);  }

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

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.

Article Tags :
Practice Tags :