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 = 100Output :3Explanation:The three subsequences with sum less than or equal to 100 are {84}, {87} and {73}.Input :arr[] = {25, 13, 40}, X = 50Output :4Explanation: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(2^{N})

**Efficient Approach:** Generate the count of subsequences using Dynamic Programming. In order to solve the problem, follow the steps below:

- For any index
**ind**, ifthen, the count of subsequences including as well as excluding the element at the current index:**arr[ind]**≤**X****countSubsequence(ind, X)****=**(excluding) +**countSubsequence(ind + 1, X)**(including)**countSubsequence(ind + 1, X – arr[ind])**

- Else, count subsequences excluding the current index:
**countSubsequence(ind, X)****=**(excluding)**countSubsequence(ind + 1, X)**

- 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>` `using` `namespace` `std;` ` ` `// Utility function to return the count` `// of subsequence in an array with sum` `// less than or equal to X` `int` `countSubsequenceUtil(` ` ` `int` `ind, ` `int` `sum,` ` ` `int` `* A, ` `int` `N,` ` ` `vector<vector<` `int` `> >& dp)` `{` ` ` `// Base condition` ` ` `if` `(ind == N)` ` ` `return` `1;` ` ` ` ` `// Return if the sub-problem` ` ` `// is already calculated` ` ` `if` `(dp[ind][sum] != -1)` ` ` `return` `dp[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` ` ` `return` `dp[ind][sum];` `}` ` ` `// Function to return the count of subsequence` `// in an array with sum less than or equal to X` `int` `countSubsequence(` `int` `* A, ` `int` `N, ` `int` `X)` `{` ` ` `// Initialize a DP array` ` ` `vector<vector<` `int` `> > dp(` ` ` `N,` ` ` `vector<` `int` `>(X + 1, -1));` ` ` ` ` `// Return the result` ` ` `return` `countSubsequenceUtil(0, X, A,` ` ` `N, dp)` ` ` `- 1;` `}` ` ` `// Driver Code` `int` `main()` `{` ` ` `int` `arr[] = { 25, 13, 40 }, X = 50;` ` ` ` ` `int` `N = ` `sizeof` `(arr) / ` `sizeof` `(arr[0]);` ` ` ` ` `cout << countSubsequence(arr, N, X);` ` ` ` ` `return` `0;` `}` |

## Java

`// Java program to count number` `// of subsequences in an array` `// with sum less than or equal to X` `class` `GFG{` ` ` `// Utility function to return the count` `// of subsequence in an array with sum` `// less than or equal to X` `static` `int` `countSubsequenceUtil(` `int` `ind, ` `int` `sum,` ` ` `int` `[]A, ` `int` `N,` ` ` `int` `[][]dp)` `{` ` ` ` ` `// Base condition` ` ` `if` `(ind == N)` ` ` `return` `1` `;` ` ` ` ` `// Return if the sub-problem` ` ` `// is already calculated` ` ` `if` `(dp[ind][sum] != -` `1` `)` ` ` `return` `dp[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` ` ` `return` `dp[ind][sum];` `}` ` ` `// Function to return the count of subsequence` `// in an array with sum less than or equal to X` `static` `int` `countSubsequence(` `int` `[] A, ` `int` `N, ` `int` `X)` `{` ` ` ` ` `// Initialize a DP array` ` ` `int` `[][]dp = ` `new` `int` `[N][X + ` `1` `];` ` ` `for` `(` `int` `i = ` `0` `; i < N; i++)` ` ` `{` ` ` `for` `(` `int` `j = ` `0` `; j < X + ` `1` `; j++)` ` ` `{` ` ` `dp[i][j] = -` `1` `;` ` ` `}` ` ` `}` ` ` ` ` `// Return the result` ` ` `return` `countSubsequenceUtil(` `0` `, X, A,` ` ` `N, dp) - ` `1` `;` `}` ` ` `// Driver Code` `public` `static` `void` `main(String[] args)` `{` ` ` `int` `arr[] = { ` `25` `, ` `13` `, ` `40` `}, X = ` `50` `;` ` ` `int` `N = arr.length;` ` ` ` ` `System.out.print(countSubsequence(arr, N, X));` `}` `}` ` ` `// This code is contributed by Rajput-Ji` |

## C#

`// C# program to count number` `// of subsequences in an array` `// with sum less than or equal to X` `using` `System;` ` ` `class` `GFG{` ` ` `// Utility function to return the count` `// of subsequence in an array with sum` `// less than or equal to X` `static` `int` `countSubsequenceUtil(` `int` `ind, ` `int` `sum,` ` ` `int` `[]A, ` `int` `N,` ` ` `int` `[,]dp)` `{` ` ` ` ` `// Base condition` ` ` `if` `(ind == N)` ` ` `return` `1;` ` ` ` ` `// Return if the sub-problem` ` ` `// is already calculated` ` ` `if` `(dp[ind, sum] != -1)` ` ` `return` `dp[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` ` ` `return` `dp[ind, sum];` `}` ` ` `// Function to return the count of subsequence` `// in an array with sum less than or equal to X` `static` `int` `countSubsequence(` `int` `[] A, ` `int` `N, ` `int` `X)` `{` ` ` ` ` `// Initialize a DP array` ` ` `int` `[,]dp = ` `new` `int` `[N, X + 1];` ` ` `for` `(` `int` `i = 0; i < N; i++)` ` ` `{` ` ` `for` `(` `int` `j = 0; j < X + 1; j++)` ` ` `{` ` ` `dp[i, j] = -1;` ` ` `}` ` ` `}` ` ` ` ` `// Return the result` ` ` `return` `countSubsequenceUtil(0, X, A,` ` ` `N, dp) - 1;` `}` ` ` `// Driver Code` `public` `static` `void` `Main(String[] args)` `{` ` ` `int` `[]arr = { 25, 13, 40 };` ` ` `int` `X = 50;` ` ` `int` `N = arr.Length;` ` ` ` ` `Console.Write(countSubsequence(arr, N, X));` `}` `}` ` ` `// This code is contributed by 29AjayKumar` |

**Output:**

4

**Time Complexity:** O(N*X)