Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tích lớn nhất tập con của mảng trong C++


Mô tả bài toán

Cho mảng chứa số dương, âm, 0. Tìm tập con (không cần liên tiếp) có tích lớn nhất.

Giải pháp (Xử lý dấu)

  • Đếm số âm (count_neg), số 0 (count_zero), tìm âm lớn nhất (gần 0 nhất) max_neg.
  • Tích tất cả phần tử khác 0 → prod.
  • Nếu toàn 0 → trả 0.
  • Nếu số âm lẻ:
    • Nếu chỉ có 1 âm và toàn 0 còn lại → trả 0.
    • Ngược lại chia prod cho max_neg (loại âm nhỏ nhất).
  • Trả về prod.

Ví dụ minh họa

#include <bits/stdc++.h>
using namespace std;

int maxProductSubset(int a[], int n) {
    if (n == 1) return a[0];
    int max_neg = INT_MIN, count_neg = 0, count_zero = 0, prod = 1;
    for (int i = 0; i < n; i++) {
        if (a[i] == 0) { count_zero++; continue; }
        if (a[i] < 0) { count_neg++; max_neg = max(max_neg, a[i]); }
        prod *= a[i];
    }
    if (count_zero == n) return 0;
    if (count_neg & 1) {
        if (count_neg == 1 && count_zero > 0 && count_zero + count_neg == n) return 0;
        prod /= max_neg;
    }
    return prod;
}

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

Đầu ra

24