Count of subsets of integers from 1 to N having no adjacent elements
Last Updated :
12 Jul, 2025
Given an integer N, the task is to count the number of subsets formed from an array of integers from 1 to N which doesn't contain adjacent elements. A subset can't be chosen if it satisfies the non-adjacent element condition, but it is possible to add more elements.
Examples:
Input: N = 4
Output: 3
Explanation:
Array is {1, 2, 3, 4}
So to satisfy the condition, the subsets formed are :
{1, 3}, {2, 4}, {1, 4}
Input: N = 5
Output: 4
Approach:
This problem can be solved by using Dynamic Programming. For the last element, we have two choices, either we include it, or we exclude it. Let DP[i] be the number of our desirable subsets ending at index i.
So next Subproblem becomes DP[i-3]
So the DP relation becomes :
DP[i] = DP[i-2] + DP[i-3]
But, we need to observe the base cases:
- When N=0, we cannot form any subset with 0 numbers.
- When N=1, we can form 1 subset, {1}
- When N=2, we can form 2 subsets, {1}, {2}
- When N=3, we can form 2 subsets, {1, 3}, {2}
Below is the implementation of above approach:
C++
// C++ Code to count subsets not containing
// adjacent elements from 1 to N
#include <bits/stdc++.h>
using namespace std;
// Function to count subsets
int countSubsets(int N)
{
if(N <= 2)
return N;
if(N == 3)
return 2;
int DP[N + 1] = {0};
DP[0] = 0, DP[1] = 1, DP[2] = 2, DP[3] = 2;
for (int i = 4; i <= N; i++) {
DP[i] = DP[i - 2] + DP[i - 3];
}
return DP[N];
}
// Driver Code
int main()
{
int N = 20;
cout << countSubsets(N);
return 0;
}
Java
// Java code to count subsets not containing
// adjacent elements from 1 to N
class GFG{
// Function to count subsets
static int countSubsets(int N)
{
if(N <= 2)
return N;
if(N == 3)
return 2;
int []DP = new int[N + 1];
DP[0] = 0;
DP[1] = 1;
DP[2] = 2;
DP[3] = 2;
for(int i = 4; i <= N; i++)
{
DP[i] = DP[i - 2] + DP[i - 3];
}
return DP[N];
}
// Driver code
public static void main(String[] args)
{
int N = 20;
System.out.print(countSubsets(N));
}
}
// This code is contributed by sapnasingh4991
Python3
# Python3 Code to count subsets
# not containing adjacent elements
# from 1 to N
# Function to count subsets
def countSubsets(N):
if(N <= 2):
return N
if(N == 3):
return 2
DP = [0] * (N + 1)
DP[0] = 0
DP[1] = 1
DP[2] = 2
DP[3] = 2
for i in range(4, N + 1):
DP[i] = DP[i - 2] + DP[i - 3]
return DP[N]
# Driver Code
if __name__ == '__main__':
N = 20
print(countSubsets(N))
# This code is contributed by Mohit Kumar
C#
// C# code to count subsets not containing
// adjacent elements from 1 to N
using System;
class GFG{
// Function to count subsets
static int countSubsets(int N)
{
if(N <= 2)
return N;
if(N == 3)
return 2;
int []DP = new int[N + 1];
DP[0] = 0;
DP[1] = 1;
DP[2] = 2;
DP[3] = 2;
for(int i = 4; i <= N; i++)
{
DP[i] = DP[i - 2] + DP[i - 3];
}
return DP[N];
}
// Driver code
public static void Main(String[] args)
{
int N = 20;
Console.Write(countSubsets(N));
}
}
// This code is contributed by sapnasingh4991
JavaScript
<script>
// javascript code to count subsets not containing
// adjacent elements from 1 to N
// Function to count subsets
function countSubsets(N) {
if (N <= 2)
return N;
if (N == 3)
return 2;
var DP = Array(N + 1).fill(0);
DP[0] = 0;
DP[1] = 1;
DP[2] = 2;
DP[3] = 2;
for (i = 4; i <= N; i++) {
DP[i] = DP[i - 2] + DP[i - 3];
}
return DP[N];
}
// Driver code
var N = 20;
document.write(countSubsets(N));
// This code contributed by gauravrajput1
</script>
Time Complexity: O(N)
Space Complexity: O(N)
Efficient approach: Space-optimized approach
In this approach, we optimize the space by using variables.
Implementation steps :
- Initialize variables to store previous computations : prev1, prev2 , prev3, prev4
- The current computation is depend upon the prev3 and prev2.
- After every iteration update these variables to iterate further.
- At last return answer stored in curr.
Implementation:
C++
// C++ Code to count subsets not containing
// adjacent elements from 1 to N
#include <bits/stdc++.h>
using namespace std;
// Function to count subsets
int countSubsets(int N)
{
// Base Case
if(N <= 2)
return N;
if(N == 3)
return 2;
int prev1 = 0, prev2 = 1, prev3 = 2, prev4 = 2 , curr;
for (int i = 4; i <= N; i++) {
curr = prev3 + prev2;
// assigning value to iterate further
prev1 = prev2;
prev2= prev3;
prev3 = prev4;
prev4 = curr;
}
// return answer
return curr;
}
// Driver Code
int main()
{
int N = 20;
// function call
cout << countSubsets(N);
return 0;
}
Java
// Java program for above approach
import java.util.*;
public class Main {
// Function to count subsets
public static int countSubsets(int N)
{
// Base Case
if (N <= 2) {
return N;
}
if (N == 3) {
return 2;
}
int prev1 = 0, prev2 = 1, prev3 = 2;
int prev4 = 2, curr = 0;
// loop to get the current value
// from previous computations
for (int i = 4; i <= N; i++) {
curr = prev3 + prev2;
// assigning value to iterate further
prev1 = prev2;
prev2 = prev3;
prev3 = prev4;
prev4 = curr;
}
// return answer
return curr;
}
// Driver Code
public static void main(String[] args)
{
int N = 20;
System.out.println(countSubsets(N));
}
}
Python3
# Python3 Code to count subsets not containing
# adjacent elements from 1 to N
# Function to count subsets
def countSubsets(N):
# Base Case
if(N <= 2):
return N
if(N == 3):
return 2
prev1 = 0
prev2 = 1
prev3 = 2
prev4 = 2
curr = 0
for i in range(4, N+1):
curr = prev3 + prev2
# assigning value to iterate further
prev1 = prev2
prev2 = prev3
prev3 = prev4
prev4 = curr
# return answer
return curr
# Driver Code
N = 20
# function call
print(countSubsets(N))
C#
// C# program for above approach
using System;
class MainClass {
// Function to count subsets
public static int CountSubsets(int N)
{
// Base Case
if (N <= 2) {
return N;
}
if (N == 3) {
return 2;
}
int prev1 = 0, prev2 = 1, prev3 = 2, prev4 = 2,
curr = 0;
// loop to get the current value from previous
// computations
for (int i = 4; i <= N; i++) {
curr = prev3 + prev2;
// assigning value to iterate further
prev1 = prev2;
prev2 = prev3;
prev3 = prev4;
prev4 = curr;
}
// return answer
return curr;
}
// Driver Code
public static void Main(string[] args)
{
int N = 20;
// function call
Console.WriteLine(CountSubsets(N));
}
}
JavaScript
// Function to count subsets
function countSubsets(N) {
// Base Case
if (N <= 2) {
return N;
}
if (N == 3) {
return 2;
}
let prev1 = 0, prev2 = 1, prev3 = 2, prev4 = 2 , curr;
for (let i = 4; i <= N; i++) {
curr = prev3 + prev2;
// assigning value to iterate further
prev1 = prev2;
prev2= prev3;
prev3 = prev4;
prev4 = curr;
}
// return answer
return curr;
}
// Driver Code
const N = 20;
// function call
console.log(countSubsets(N));
Time Complexity: O(N)
Auxiliary Space: O(1)
Similar Reads
Count of distinct integers in range [1, N] that do not have any subset sum as K Given two positive integers N and K such that K?N, the task is to find the maximum number of distinct integers in the range [1, N] having no subset with a sum equal to K. If there are multiple solutions, print any. Examples: Input: N = 5, K = 3Output: 1 4 5Explanation: There are two sets of distinct
6 min read
Count of subsets not containing adjacent elements Given an array arr[] of N integers, the task is to find the count of all the subsets which do not contain adjacent elements from the given array.Examples: Input: arr[] = {2, 7} Output: 3 All possible subsets are {}, {2} and {7}. Input: arr[] = {3, 5, 7} Output: 5 Method 1: Using bit masking Idea: Th
12 min read
Count of subsets not containing adjacent elements Given an array arr[] of N integers, the task is to find the count of all the subsets which do not contain adjacent elements from the given array.Examples: Input: arr[] = {2, 7} Output: 3 All possible subsets are {}, {2} and {7}. Input: arr[] = {3, 5, 7} Output: 5 Method 1: Using bit masking Idea: Th
12 min read
Count of subsets not containing adjacent elements Given an array arr[] of N integers, the task is to find the count of all the subsets which do not contain adjacent elements from the given array.Examples: Input: arr[] = {2, 7} Output: 3 All possible subsets are {}, {2} and {7}. Input: arr[] = {3, 5, 7} Output: 5 Method 1: Using bit masking Idea: Th
12 min read
Count of all subsequences having adjacent elements with different parity Given an array arr[] of size N, the task is to find the number of non-empty subsequences from the given array such that no two adjacent elements of the subsequence have the same parity. Examples: Input: arr[] = [5, 6, 9, 7] Output: 9 Explanation: All such subsequences of given array will be {5}, {6}
9 min read
Count of all subsequences having adjacent elements with different parity Given an array arr[] of size N, the task is to find the number of non-empty subsequences from the given array such that no two adjacent elements of the subsequence have the same parity. Examples: Input: arr[] = [5, 6, 9, 7] Output: 9 Explanation: All such subsequences of given array will be {5}, {6}
9 min read