Count of subsets with sum one less than the sum of Array
Last Updated :
23 Nov, 2021
Given an array arr[ ] of size N. The task is to find the no of subsets with sum as (sum of the array – 1) when 0 occurs in an array or return -1 if there is no subset possible.
Examples:
Input: arr[ ] : {3, 0, 5, 2, 4}
Output: -1
Explanation: sum of array arr[ ] is 14 and there is not any subset with sum 13.
Input: arr[ ] : {0, 0, 2, 1}
Output: 4
Explanation: sum of array arr[ ] is 3 and {0, 2}, {0, 2}, {0, 0, 2}, {2} are the four subsets with sum 2 .
Naive Approach: The task can be solved by generating all possible subsets of the array using recursion, and increment the count if a subset with sum as (sum of the array – 1) is encountered.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int subsetSum( int arr[], int n, int i,
int sum, int count)
{
if (i == n) {
if (sum == 0) {
count++;
}
return count;
}
count = subsetSum(arr, n, i + 1,
sum - arr[i], count);
count = subsetSum(arr, n, i + 1,
sum, count);
return count == 0 ? -1 : count;
}
int main()
{
int arr[] = { 0, 0, 2, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
int sum = accumulate(arr, arr + n, 0) - 1;
cout << subsetSum(arr, n, 0, sum, 0);
}
|
Java
public class GFG {
static int subsetSum( int arr[], int n, int i,
int sum, int count)
{
if (i == n) {
if (sum == 0 ) {
count++;
}
return count;
}
count = subsetSum(arr, n, i + 1 ,
sum - arr[i], count);
count = subsetSum(arr, n, i + 1 ,
sum, count);
return count == 0 ? - 1 : count;
}
static int accumulate( int []arr)
{
int sum = 0 ;
for ( int i = 0 ; i < arr.length; i++)
sum += arr[i];
return sum;
}
public static void main (String[] args)
{
int arr[] = { 0 , 0 , 2 , 1 };
int n = arr.length;
int sum = accumulate(arr) - 1 ;
System.out.println(subsetSum(arr, n, 0 , sum, 0 ));
}
}
|
Python3
def subsetSum(arr, n, i, sum , count):
if (i = = n):
if ( sum = = 0 ):
count + = 1
return count
count = subsetSum(arr, n, i + 1 ,
sum - arr[i], count)
count = subsetSum(arr, n, i + 1 ,
sum , count)
return - 1 if count = = 0 else count
def accumulate(arr):
sum = 0
for i in range ( len (arr)):
sum + = arr[i]
return sum
arr = [ 0 , 0 , 2 , 1 ]
n = len (arr)
sum = accumulate(arr) - 1
print (subsetSum(arr, n, 0 , sum , 0 ))
|
C#
using System;
public class GFG {
static int subsetSum( int []arr, int n, int i,
int sum, int count)
{
if (i == n) {
if (sum == 0) {
count++;
}
return count;
}
count = subsetSum(arr, n, i + 1,
sum - arr[i], count);
count = subsetSum(arr, n, i + 1,
sum, count);
return count == 0 ? -1 : count;
}
static int accumulate( int []arr)
{
int sum = 0;
for ( int i = 0; i < arr.Length; i++)
sum += arr[i];
return sum;
}
public static void Main ( string [] args)
{
int []arr = { 0, 0, 2, 1 };
int n = arr.Length;
int sum = accumulate(arr) - 1;
Console.WriteLine(subsetSum(arr, n, 0, sum, 0));
}
}
|
Javascript
<script>
function subsetSum(arr, n, i,
sum, count)
{
if (i == n) {
if (sum == 0) {
count++;
}
return count;
}
count = subsetSum(arr, n, i + 1,
sum - arr[i], count);
count = subsetSum(arr, n, i + 1,
sum, count);
return count == 0 ? -1 : count;
}
function accumulate(arr) {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
let arr = [0, 0, 2, 1];
let n = arr.length;
let sum = accumulate(arr) - 1;
document.write(subsetSum(arr, n, 0, sum, 0));
</script>
|
Time complexity: O(2n), where n = array length
Auxiliary Space: O(n), recursion stack space
Efficient Approach: The above approach can be optimized by finding a possible subset with sum as (array_sum – 1) by removing 0s and one 1 from the array so that the subset-sum becomes equal to (sum of the array – 1 ).
- If there are k zeroes in the array, then there are 2^k (k is the number of zeroes) ways to remove 0 from the array.
- The multiplication of these two (no of ways to remove 0 and no of ways to remove 1) results in the no of possible subsets.
Below is the implementation of the above code:
C++
#include <bits/stdc++.h>
using namespace std;
int subsetCount( int arr[], int n)
{
int zeros = 0, ones = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] == 0) {
zeros++;
}
else if (arr[i] == 1) {
ones++;
}
}
int no_of_ways_0 = pow (2, zeros);
int no_of_ways_1 = ones;
int count_subset = no_of_ways_0
* no_of_ways_1;
if (count_subset == 0)
return -1;
return count_subset;
}
int main()
{
int arr[] = { 0, 0, 2, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << subsetCount(arr, n);
}
|
Java
import java.util.*;
public class GFG
{
static int subsetCount( int []arr, int n)
{
int zeros = 0 , ones = 0 ;
for ( int i = 0 ; i < n; i++) {
if (arr[i] == 0 ) {
zeros++;
}
else if (arr[i] == 1 ) {
ones++;
}
}
int no_of_ways_0 = ( int )Math.pow( 2 , zeros);
int no_of_ways_1 = ones;
int count_subset = no_of_ways_0
* no_of_ways_1;
if (count_subset == 0 )
return - 1 ;
return count_subset;
}
public static void main(String args[])
{
int []arr = { 0 , 0 , 2 , 1 };
int n = arr.length;
System.out.println(subsetCount(arr, n));
}
}
|
Python3
def subsetCount(arr, n):
zeros = 0
ones = 0
for i in range (n):
if (arr[i] = = 0 ):
zeros + = 1
elif (arr[i] = = 1 ):
ones + = 1
no_of_ways_0 = pow ( 2 , zeros)
no_of_ways_1 = ones
count_subset = no_of_ways_0 * no_of_ways_1
if (count_subset = = 0 ):
return - 1
return count_subset
if __name__ = = "__main__" :
arr = [ 0 , 0 , 2 , 1 ]
n = len (arr)
print (subsetCount(arr, n))
|
C#
using System;
class GFG
{
static int subsetCount( int []arr, int n)
{
int zeros = 0, ones = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] == 0) {
zeros++;
}
else if (arr[i] == 1) {
ones++;
}
}
int no_of_ways_0 = ( int )Math.Pow(2, zeros);
int no_of_ways_1 = ones;
int count_subset = no_of_ways_0
* no_of_ways_1;
if (count_subset == 0)
return -1;
return count_subset;
}
public static void Main()
{
int []arr = { 0, 0, 2, 1 };
int n = arr.Length;
Console.Write(subsetCount(arr, n));
}
}
|
Javascript
<script>
function subsetCount(arr, n)
{
let zeros = 0, ones = 0;
for (let i = 0; i < n; i++) {
if (arr[i] == 0) {
zeros++;
}
else if (arr[i] == 1) {
ones++;
}
}
let no_of_ways_0 = Math.pow(2, zeros);
let no_of_ways_1 = ones;
let count_subset = no_of_ways_0
* no_of_ways_1;
if (count_subset == 0)
return -1;
return count_subset;
}
let arr = [ 0, 0, 2, 1 ];
let n = arr.length;
document.write(subsetCount(arr, n));
</script>
|
Time complexity: O(n), where n = array length
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...