Maximum Product Subset Problem

Posted in

Maximum Product Subset Problem
vinaykhatri

Vinay Khatri
Last updated on February 10, 2025

Problem

Given array a, we have to find the maximum product possible with the subset of elements present in the array.

Sample Input

[1, -2, 4, 4]

Sample Output

16

Explanation

4 x 4 x 1 = 16

Approach

If there are even numbers that are negative and no zero is present, then the outcome is just the product of all numbers because we will require all elements. If there's an odd number of negatives and no zeros, take the product of all except the negative integer with the least absolute value as the product of the result.

If there are zeros, the result is the product of all except these zeros with one exceptional case: when there is one negative number and all other elements are 0, then the answer is 0.

C++ Programming

#include <bits/stdc++.h>
using namespace std;
//function to get maximum subset
int solve(int a[], int n)
{
 if (n == 1)
    return a[0];
 int maxNeg = INT_MIN;
 int countNeg = 0, count_zero = 0;
 int ans = 1;
 for (int i = 0; i < n; i++) {
     // If number is 0, we don't consider it
     if (a[i] == 0) 
        {
        count_zero++;
         continue;
        }
     if (a[i] < 0) 
       {
         countNeg++;
         maxNeg = max(maxNeg, a[i]);
       }

      ans = ans * a[i];
 }

 if (count_zero == n)
     return 0;

 // If there are odd number of
 // negatives
 if (countNeg & 1) 
     {
      // Exceptional case: There is only one negative and all other are zeros
      if (countNeg == 1 && count_zero > 0 && count_zero + countNeg == n)
         return 0;
 ans = ans / maxNeg;
 }

 return ans;
}

int main()
{
 int a[] = { -1, 4, 4, 1};
 int n = sizeof(a) / sizeof(a[0]);
 cout << solve(a, n);
 return 0;
}

Output

16

C Programming

#include<stdio.h>
#define INT_MIN -1000000000
//function to get maximum subset
int max(int a, int b)
{
    return a>=b?a:b;
}
int solve(int a[], int n)
{
   if (n == 1)
      return a[0];
   int maxNeg = INT_MIN;   //declare minimum possible value
   int countNeg = 0, count_zero = 0;
   int ans = 1;
   for (int i = 0; i < n; i++) 
   {
     // If number is 0, we don't consider it
     if (a[i] == 0) 
      {
      count_zero++;
      continue;
      }
     if (a[i] < 0) 
     {
      countNeg++;
      maxNeg = max(maxNeg, a[i]);
     }

     ans = ans * a[i];
  }

  if (count_zero == n)
     return 0;

  // If there are odd number of
  // negatives
  if (countNeg & 1) 
    {
     // Exceptional case: There is only one negative and all other are zeros
     if (countNeg == 1 && count_zero > 0 && count_zero + countNeg == n)
        return 0;
    ans = ans / maxNeg;
     }
  return ans;
}

int main()
{
   int a[] = { -1, 4, 4, 1};
   int n = sizeof(a) / sizeof(a[0]);
   printf("%d",solve(a, n));
   return 0;
}

Output

16

Python Programming

def solve(a, n):
    if n == 1:
        return a[0]

    maxNeg = -999999999999
    countNeg = 0
    countZero = 0
    ans = 1

    for i in range(n):
        if a[i] == 0:
            countZero += 1
            continue

        if a[i] < 0:
            countNeg += 1
            maxNeg = max(maxNeg, a[i])
        ans = ans * a[i]

    if countZero == n:
        return 0

    if countNeg & 1:
        if (countNeg == 1 and countZero > 0 and
            countZero + countNeg == n):
            return 0

        ans = int(ans / maxNeg)
    return ans

if __name__ == '__main__':
    a = [ -1, 4, 4, 1]
    n = len(a)
    print(solve(a, n))

Output

16

People are also reading:

Leave a Comment on this Post

0 Comments