ในปัญหา เราได้รับอาร์เรย์ arr[] ของค่าจำนวนเต็ม n ค่า งานของเราคือสร้างโปรแกรมเพื่อค้นหาชุดย่อยผลิตภัณฑ์สูงสุดของอาร์เรย์
คำอธิบายปัญหา − ในที่นี้ เราต้องคำนวณผลคูณสูงสุดที่เป็นไปได้ของชุดย่อยขององค์ประกอบของอาร์เรย์
เซตย่อย − Array sub[] คือชุดย่อยของ array arr[] หากองค์ประกอบทั้งหมดของ sub[] มีอยู่ใน arr[]
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
arr[] = {4, 5, 2, −1, 3} ผลลัพธ์
40
คำอธิบาย
Subset sub[] = {4, 5, 2}
Prod = 4*5*2 = 40 แนวทางการแก้ปัญหา
แนวทางที่ง่ายและสะดวกในการแก้ปัญหาคือการสร้างชุดย่อยที่เป็นไปได้ทั้งหมดของอาร์เรย์ ค้นหาผลิตภัณฑ์และคืนสินค้าสูงสุด
โซลูชันนี้ใช้งานง่าย แต่ต้องใช้การวนซ้ำซ้อนทำให้ความซับซ้อนของลำดับของ O(n 2 *น)
ลองใช้ที่นี่
วิธีแก้ปัญหาที่มีประสิทธิภาพ คือโดยการคำนวณจำนวนค่าลบ (nofNeg) และค่าศูนย์ (nof0) จากอาร์เรย์แล้วคำนวณ maxProd ตามเงื่อนไขเหล่านี้
กรณีที่ 1 (nof0 =0 และ nofNeg เป็นเลขคู่)− พิจารณาองค์ประกอบทั้งหมดของอาร์เรย์ไปยังผลิตภัณฑ์
maxProd =arr[0] * arr[1] * … arr[n−1]
กรณีที่ 2 (nof0 =0 และ nofNeg เป็นเลขคี่)− พิจารณาองค์ประกอบทั้งหมดของอาร์เรย์ ยกเว้นองค์ประกอบเชิงลบที่ใหญ่ที่สุดของอาร์เรย์ (ใกล้สุดถึง 0)
กรณีที่ 3 (nof0 !=0)− ปล่อยให้ศูนย์ทั้งหมดของอาร์เรย์สำหรับผลิตภัณฑ์ และเอาเคสที่คล้ายกับกรณีที่ 1 และ 2
กรณีพิเศษ - มีเพียงองค์ประกอบเดียวยกเว้น 0 ที่เป็นค่าลบ maxProd =0.
อัลกอริทึม
เริ่มต้น −
maxProd = 1;
ขั้นตอนที่ 1 −
Loop the array and count, nof0(number of zeros) and nofNeg(number of negatives), and find maxProd. maxProd = maxProd*arr[i], i −> 0 to n−1
ขั้นตอนที่ 2 −
consider the following cases − Case 1− if(nofNeg%2 == 0): maxProd Case 2− if(nofNeg%2 != 0): maxProd = maxProd/(largestNeg) Case 3 − if(nof0 == (n-1) and nofNeg == 1), maxProd = 0.
ขั้นตอนที่ 3
Print maxProd.
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream>
using namespace std;
int findMaxSubsetProd(int arr[], int n){
int larNeg = −1000;
int nofNeg = 0, Nof0 = 0;
int maxProd = 1;
for (int i = 0; i < n; i++) {
if (arr[i] == 0){
Nof0++;
continue;
}
else if (arr[i] < 0) {
nofNeg++;
if(larNeg < arr[i])
larNeg = arr[i];
}
maxProd = maxProd * arr[i];
}
if(nofNeg%2 == 0){
return maxProd;
}
else if(nofNeg%2 != 0)
return (maxProd / larNeg);
if(Nof0 == (n−1) and nofNeg == 1)
return 0;
return maxProd;
}
int main(){
int arr[] = {4, −2, 5, −1, 3, −6};
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"The maximum product subset of an array is "<<findMaxSubsetProd(arr, n);
return 0;
} ผลลัพธ์
The maximum product subset of an array is 720