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++
#include <bits/stdc++.h>
using namespace std;
void findSub(vector<vector< int > >& res, int sum,
int K, int N, vector< int >& temp)
{
if (K == 0 && sum == 0) {
res.push_back(temp);
return ;
}
if (sum <= 0 || K <= 0) {
return ;
}
for ( int i = 1; i <= N; i++) {
temp.push_back(i);
findSub(res, sum - i, K - 1, N, temp);
temp.pop_back();
}
}
void UtilPrintSubsequncesOfKSumN( int N, int K)
{
vector<vector< int > > res;
vector< int > temp;
findSub(res, N, K, N, temp);
int sz = res.size();
cout << "{ " ;
for ( int i = 0; i < sz; i++) {
cout << "{ " ;
for ( int j = 0; j < K; j++) {
if (j == K - 1)
cout << res[i][j] << " " ;
else
cout << res[i][j] << ", " ;
}
if (i == sz - 1)
cout << "}" ;
else
cout << "}, " ;
}
cout << " }" ;
}
int main()
{
int N = 4;
int K = 2;
UtilPrintSubsequncesOfKSumN(N, K);
}
|
Java
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
class GFG {
static void findSub(List<List<Integer> > res, int sum,
int K, int N, List<Integer> temp)
{
if (K == 0 && sum == 0 ) {
List<Integer> newList = temp.stream().collect(
Collectors.toList());
res.add(newList);
return ;
}
if (sum <= 0 || K <= 0 ) {
return ;
}
for ( int i = 1 ; i <= N; i++) {
temp.add(i);
findSub(res, sum - i, K - 1 , N, temp);
temp.remove(temp.size() - 1 );
}
}
static void UtilPrintSubsequncesOfKSumN( int N, int K)
{
@SuppressWarnings ( "unchecked" )
List<List<Integer> > res = new ArrayList();
@SuppressWarnings ( "unchecked" )
List<Integer> temp = new ArrayList();
findSub(res, N, K, N, temp);
int sz = res.size();
System.out.print( "{ " );
for ( int i = 0 ; i < sz; i++) {
System.out.print( "{ " );
for ( int j = 0 ; j < K; j++) {
if (j == K - 1 )
System.out.print(res.get(i).get(j)
+ " " );
else
System.out.print(res.get(i).get(j)
+ ", " );
}
if (i == sz - 1 )
System.out.print( "}" );
else
System.out.print( "}, " );
}
System.out.print( " }" );
}
public static void main(String[] args)
{
int N = 4 ;
int K = 2 ;
UtilPrintSubsequncesOfKSumN(N, K);
}
}
|
Python3
def findSub(res, sum ,K,N,temp):
if (K = = 0 and sum = = 0 ):
res.append(temp[:])
return
if ( sum < = 0 or K < = 0 ):
return
for i in range ( 1 ,N):
temp.append(i)
findSub(res, sum - i, K - 1 , N, temp)
temp.pop()
def UtilPrintSubsequncesOfKSumN(N, K):
res = []
temp = []
findSub(res, N, K, N, temp)
sz = len (res)
print ( "{" ,end = " " )
for i in range (sz):
print ( "{" ,end = " " )
for j in range (K):
if (j = = K - 1 ):
print (res[i][j],end = " " )
else :
print (res[i][j],end = ", " )
if (i = = sz - 1 ):
print ( "}" ,end = "")
else :
print ( "}," ,end = " " )
print ( " }" )
N = 4
K = 2
UtilPrintSubsequncesOfKSumN(N, K)
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
namespace GFG {
class Program {
static void FindSub(List<List< int > > res, int sum,
int K, int N, List< int > temp)
{
if (K == 0 && sum == 0) {
List< int > newList = temp.ToList();
res.Add(newList);
return ;
}
if (sum <= 0 || K <= 0) {
return ;
}
for ( int i = 1; i <= N; i++) {
temp.Add(i);
FindSub(res, sum - i, K - 1, N, temp);
temp.RemoveAt(temp.Count - 1);
}
}
static void UtilPrintSubsequncesOfKSumN( int N, int K)
{
var res = new List<List< int > >();
var temp = new List< int >();
FindSub(res, N, K, N, temp);
int sz = res.Count;
Console.Write( "{ " );
for ( int i = 0; i < sz; i++) {
Console.Write( "{ " );
for ( int j = 0; j < K; j++) {
if (j == K - 1)
Console.Write(res[i][j] + " " );
else
Console.Write(res[i][j] + ", " );
}
if (i == sz - 1)
Console.Write( "}" );
else
Console.Write( "}, " );
}
Console.WriteLine( " }" );
}
static void Main( string [] args)
{
int N = 4;
int K = 2;
UtilPrintSubsequncesOfKSumN(N, K);
}
}
}
|
Javascript
function findSub(res,sum,K,N,temp)
{
if (K == 0 && sum == 0)
{
res.push([...temp])
return
}
if (sum <= 0||K <= 0)
return
for ( var i = 1; i < N; i++)
{
temp.push(i)
findSub(res, sum - i, K - 1, N, temp)
temp.pop()
}
}
function UtilPrintSubsequncesOfKSumN(N, K)
{
let res = []
let temp = []
findSub(res, N, K, N, temp)
let sz = res.length
process.stdout.write( "{" + " " )
for ( var i = 0; i < sz; i++)
{
process.stdout.write( "{" + " " )
for ( var j = 0; j < K; j++)
{
if (j == K - 1)
process.stdout.write(res[i][j]+ " " )
else
process.stdout.write(res[i][j] + ", " )
}
if (i == sz - 1)
process.stdout.write( "}" + "" )
else
process.stdout.write( "}," + " " )
}
process.stdout.write( " }" )
}
let N = 4
let 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
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
29 Dec, 2022
Like Article
Save Article