Count of subsequences in an array with sum less than or equal to X

Given an integer array arr[] of size N and an integer X, the task is to count the number of subsequences in that array such that its sum is less than or equal to X. 
Note: 1 <= N <= 1000 and 1 <= X <= 1000, where N is the size of the array.
Examples:
Input : arr[] = {84, 87, 73}, X = 100
Output : 3
Explanation: The three subsequences with sum less than or equal to 100 are {84}, {87} and {73}.Input : arr[] = {25, 13, 40}, X = 50
Output : 4
Explanation: The four subsequences with sum less than or equal to 50 are {25}, {13}, {40} and {25, 13}.
Naive Approach: Generate all the subsequences of the array and check if the sum is less than or equal to X. 
Time complexity:O(2N)
Efficient Approach: Generate the count of subsequences using Dynamic Programming. In order to solve the problem, follow the steps below:
- For any index ind, if arr[ind] ? X then, the count of subsequences including as well as excluding the element at the current index:
countSubsequence(ind, X) = countSubsequence(ind + 1, X) (excluding) + countSubsequence(ind + 1, X – arr[ind]) (including)
- Else, count subsequences excluding the current index:
countSubsequence(ind, X) = countSubsequence(ind + 1, X) (excluding)
- Finally, subtract 1 from the final count returned by the function as it also counts an empty subsequence.
Below is the implementation of the above approach:
C++
| // C++ Program to count number// of subsequences in an array// with sum less than or equal to X#include <bits/stdc++.h>usingnamespacestd;// Utility function to return the count// of subsequence in an array with sum// less than or equal to XintcountSubsequenceUtil(    intind, intsum,    int* A, intN,    vector<vector<int> >& dp){    // Base condition    if(ind == N)        return1;    // Return if the sub-problem    // is already calculated    if(dp[ind][sum] != -1)        returndp[ind][sum];    // Check if the current element is    // less than or equal to sum    if(A[ind] <= sum) {        // Count subsequences excluding        // the current element        dp[ind][sum]            = countSubsequenceUtil(                  ind + 1,                  sum, A, N, dp)              +              // Count subsequences including              // the current element              countSubsequenceUtil(                  ind + 1,                  sum - A[ind],                  A, N, dp);    }    else{        // Exclude current element        dp[ind][sum]            = countSubsequenceUtil(                ind + 1,                sum, A,                N, dp);    }    // Return the result    returndp[ind][sum];}// Function to return the count of subsequence// in an array with sum less than or equal to XintcountSubsequence(int* A, intN, intX){    // Initialize a DP array    vector<vector<int> > dp(        N,        vector<int>(X + 1, -1));    // Return the result    returncountSubsequenceUtil(0, X, A,                                N, dp)           - 1;}// Driver Codeintmain(){    intarr[] = { 25, 13, 40 }, X = 50;    intN = sizeof(arr) / sizeof(arr[0]);    cout << countSubsequence(arr, N, X);    return0;} | 
Java
| // Java program to count number// of subsequences in an array// with sum less than or equal to XclassGFG{// Utility function to return the count// of subsequence in an array with sum// less than or equal to XstaticintcountSubsequenceUtil(intind, intsum,                                int[]A, intN,                                int[][]dp){        // Base condition    if(ind == N)        return1;    // Return if the sub-problem    // is already calculated    if(dp[ind][sum] != -1)        returndp[ind][sum];    // Check if the current element is    // less than or equal to sum    if(A[ind] <= sum)     {                // Count subsequences excluding        // the current element        dp[ind][sum] = countSubsequenceUtil(                           ind + 1, sum,                            A, N, dp) +                                              // Count subsequences                        // including the current                       // element                       countSubsequenceUtil(                           ind + 1,                            sum - A[ind],                            A, N, dp);    }    else    {                // Exclude current element        dp[ind][sum] = countSubsequenceUtil(                           ind + 1, sum,                           A, N, dp);    }    // Return the result    returndp[ind][sum];}// Function to return the count of subsequence// in an array with sum less than or equal to XstaticintcountSubsequence(int[] A, intN, intX){        // Initialize a DP array    int[][]dp = newint[N][X + 1];    for(inti = 0; i < N; i++)    {        for(intj = 0; j < X + 1; j++)        {            dp[i][j] = -1;        }    }        // Return the result    returncountSubsequenceUtil(0, X, A,                                N, dp) - 1;}// Driver Codepublicstaticvoidmain(String[] args){    intarr[] = { 25, 13, 40}, X = 50;    intN = arr.length;    System.out.print(countSubsequence(arr, N, X));}}// This code is contributed by Rajput-Ji | 
Python3
| # Python program for the above approach:## Utility function to return the count## of subsequence in an array with sum## less than or equal to XdefcountSubsequenceUtil(ind, s, A, N, dp):    ## Base condition    if(ind ==N):        return1    ## Return if the sub-problem    ## is already calculated    if(dp[ind][s] !=-1):        returndp[ind][s]    ## Check if the current element is    ## less than or equal to sum    if(A[ind] <=s):                ## Count subsequences excluding        ## the current element        ## Also, Count subsequences including        ## the current element        dp[ind][s] =countSubsequenceUtil(ind +1, s, A, N, dp) +countSubsequenceUtil(ind +1, s -A[ind], A, N, dp)                else:        ## Exclude current element        dp[ind][s] =countSubsequenceUtil(ind +1, s, A, N, dp)    ## Return the result    returndp[ind][s]## Function to return the count of subsequence## in an array with sum less than or equal to XdefcountSubsequence(A, N, X):    ## Initialize a DP array    dp =[[-1for_ inrange(X +1)] fori inrange(N)]    ## Return the result    returncountSubsequenceUtil(0, X, A, N, dp) -1## Driver codeif__name__=='__main__':    arr =[25, 13, 40]    X =50    N =len(arr)    print(countSubsequence(arr, N, X)) | 
C#
| // C# program to count number// of subsequences in an array// with sum less than or equal to XusingSystem;classGFG{// Utility function to return the count// of subsequence in an array with sum// less than or equal to XstaticintcountSubsequenceUtil(intind, intsum,                                int[]A, intN,                                int[,]dp){        // Base condition    if(ind == N)        return1;    // Return if the sub-problem    // is already calculated    if(dp[ind, sum] != -1)        returndp[ind, sum];    // Check if the current element is    // less than or equal to sum    if(A[ind] <= sum)     {                // Count subsequences excluding        // the current element        dp[ind, sum] = countSubsequenceUtil(                           ind + 1, sum,                            A, N, dp) +                                                  // Count subsequences                        // including the current                       // element                       countSubsequenceUtil(                           ind + 1,                            sum - A[ind],                            A, N, dp);    }    else    {                // Exclude current element        dp[ind, sum] = countSubsequenceUtil(                           ind + 1, sum,                           A, N, dp);    }    // Return the result    returndp[ind, sum];}// Function to return the count of subsequence// in an array with sum less than or equal to XstaticintcountSubsequence(int[] A, intN, intX){        // Initialize a DP array    int[,]dp = newint[N, X + 1];    for(inti = 0; i < N; i++)    {        for(intj = 0; j < X + 1; j++)        {            dp[i, j] = -1;        }    }        // Return the result    returncountSubsequenceUtil(0, X, A,                                N, dp) - 1;}// Driver CodepublicstaticvoidMain(String[] args){    int[]arr = { 25, 13, 40 };    intX = 50;    intN = arr.Length;    Console.Write(countSubsequence(arr, N, X));}}// This code is contributed by 29AjayKumar | 
Javascript
| <script>// JavaScript program to count number// of subsequences in an array// with sum less than or equal to X// Utility function to return the count// of subsequence in an array with sum// less than or equal to XfunctioncountSubsequenceUtil(ind, sum, A, N, dp){        // Base condition    if(ind == N)        return1;    // Return if the sub-problem    // is already calculated    if(dp[ind][sum] != -1)        returndp[ind][sum];    // Check if the current element is    // less than or equal to sum    if(A[ind] <= sum)     {                // Count subsequences excluding        // the current element        dp[ind][sum] = countSubsequenceUtil(                           ind + 1, sum,                            A, N, dp) +                                              // Count subsequences                        // including the current                       // element                       countSubsequenceUtil(                           ind + 1,                            sum - A[ind],                            A, N, dp);    }    else    {                // Exclude current element        dp[ind][sum] = countSubsequenceUtil(                           ind + 1, sum,                           A, N, dp);    }    // Return the result    returndp[ind][sum];}// Function to return the count of subsequence// in an array with sum less than or equal to XfunctioncountSubsequence(A, N, X){        // Initialize a DP array    let dp = newArray(N);    for(vari = 0; i < dp.length; i++)    {        dp[i] = newArray(2);    }    for(let i = 0; i < N; i++)    {        for(let j = 0; j < X + 1; j++)        {            dp[i][j] = -1;        }    }        // Return the result    returncountSubsequenceUtil(0, X, A,                                N, dp) - 1;}  // Driver Codelet arr = [ 25, 13, 40 ], X = 50;let N = arr.length;document.write(countSubsequence(arr, N, X));// This code is contributed by susmitakundugoaldanga</script> | 
4
Time Complexity: O(N*X)
Auxiliary Space: O(N*X)
Efficient approach: Using DP Tabulation method ( Iterative approach )
The approach to solve this problem is same but DP tabulation(bottom-up) method is better then Dp + memoization(top-down) because memoization method needs extra stack space of recursion calls.
Steps to solve this problem :
- Create a DP to store the solution of the subproblems.
- Initialize the DP with base cases when index = n then dp[i][j] = 1.
- Now Iterate over subproblems to get the value of current problem form previous computation of subproblems stored in DP.
- Return the final solution stored in dp[0][x] – 1.
Implementation :
C++
| // C++ program for above approach#include <bits/stdc++.h>usingnamespacestd;intcountSubsequence(int* A, intN, intX){    // Initialize a DP array    intdp[N+1][X+1];    memset(dp, 0, sizeof(dp));        // Set Base Case    for(inti=0 ; i<=N ;i++){        for(intj=0 ;j<=X ; j++){            if(i==N){                dp[i][j] = 1;            }        }    }    // Fill the DP table    // iterate over subproblems and get the current     // solution for previous computations    for(inti=N-1; i>=0; i--) {        for(intj=1; j<=X; j++) {                        // update current value            if(A[i] <= j) { // Fixed index here                dp[i][j] = dp[i+1][j] + dp[i+1][j-A[i]];            } else{                dp[i][j] = dp[i+1][j];            }        }    }    // Return the result    returndp[0][X] -1;}// Driver Codeintmain(){    intarr[] = { 25, 13, 40 }, X = 50;    intN = sizeof(arr) / sizeof(arr[0]);        // function call    cout << countSubsequence(arr, N, X);    return0;}// This code is contributed by bhardwajji. | 
Java
| importjava.util.*;publicclassMain {  publicstaticvoidmain(String[] args) {    int[] arr = {25, 13, 40};    intX = 50;    intN = arr.length;    System.out.println(countSubsequence(arr, N, X));  }  publicstaticintcountSubsequence(int[] A, intN, intX) {    // Initialize a DP array    int[][] dp = newint[N+1][X+1];    for(int[] row : dp) {      Arrays.fill(row, 0);    }    // Set Base Case    for(inti = 0; i <= N; i++) {      for(intj = 0; j <= X; j++) {        if(i == N) {          dp[i][j] = 1;        }      }    }    // Fill the DP table    // iterate over subproblems and get the current     // solution for previous computations    for(inti = N-1; i >= 0; i--) {      for(intj = 1; j <= X; j++) {        // update current value        if(A[i] <= j) {          dp[i][j] = dp[i+1][j] + dp[i+1][j-A[i]];        } else{          dp[i][j] = dp[i+1][j];        }      }    }    // Return the result    returndp[0][X] - 1;  }} | 
Python3
| defcountSubsequence(A, N, X):    # Initialize a DP array    dp =[[0forj inrange(X+1)] fori inrange(N+1)]    # Set Base Case    fori inrange(N+1):        forj inrange(X+1):            ifi ==N:                dp[i][j] =1    # Fill the DP table    # iterate over subproblems and get the current    # solution for previous computations    fori inrange(N-1, -1, -1):        forj inrange(1, X+1):            # update current value            ifA[i] <=j:                dp[i][j] =dp[i+1][j] +dp[i+1][j-A[i]]            else:                dp[i][j] =dp[i+1][j]    # Return the result    returndp[0][X] -1# Driver Codearr =[25, 13, 40]X =50N =len(arr)# function callprint(countSubsequence(arr, N, X)) | 
C#
| usingSystem;classProgram {    // Function to count subsequences of an array with sum X    staticintCountSubsequence(int[] A, intN, intX)    {        // Initialize a DP array        int[, ] dp = newint[N + 1, X + 1];        for(inti = 0; i <= N; i++) {            for(intj = 0; j <= X; j++) {                dp[i, j] = 0;            }        }        // Set Base Case        for(inti = 0; i <= N; i++) {            for(intj = 0; j <= X; j++) {                if(i == N) {                    dp[i, j] = 1;                }            }        }        // Fill the DP table        // iterate over subproblems and get the current        // solution for previous computations        for(inti = N - 1; i >= 0; i--) {            for(intj = 1; j <= X; j++) {                // update current value                if(A[i] <= j) // Fixed index here                {                    dp[i, j] = dp[i + 1, j]                               + dp[i + 1, j - A[i]];                }                else{                    dp[i, j] = dp[i + 1, j];                }            }        }        // Return the result        returndp[0, X] - 1;    }    staticvoidMain(string[] args)    {        int[] arr = { 25, 13, 40 };        intX = 50;        intN = arr.Length;        // function call        Console.WriteLine(CountSubsequence(arr, N, X));    }} | 
Javascript
| functioncountSubsequence(A, N, X) {    // Initialize a DP array    const dp = Array.from({ length: N + 1 }, () => Array(X + 1).fill(0));    // Set Base Case    for(let i = 0; i <= N; i++) {        for(let j = 0; j <= X; j++) {            if(i === N) {                dp[i][j] = 1;            }        }    }    // Fill the DP table    // iterate over subproblems and get the current    // solution for previous computations    for(let i = N - 1; i >= 0; i--) {        for(let j = 1; j <= X; j++) {            // update current value            if(A[i] <= j) {                dp[i][j] = dp[i + 1][j] + dp[i + 1][j - A[i]];            } else{                dp[i][j] = dp[i + 1][j];            }        }    }    // Return the result    returndp[0][X] - 1;}// Driver Codeconst arr = [25, 13, 40];const X = 50;const N = arr.length;// function callconsole.log(countSubsequence(arr, N, X));// This code is contributed by Samim Hossain Mondal. | 
4
Time Complexity: O(N*X)
Auxiliary Space: O(N*X)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
 
				 
					


