งานคือหาผลคูณสูงสุดของ 4 ตัวประกอบ (factors) A, B, C, D ของจำนวน N โดยมีเงื่อนไข: A + B + C + D = N และ A,B,C,D ต้องเป็นตัวประกอบของ N ทั้งหมด
ตัวอย่าง
N = 10
ตัวประกอบ: 1, 2, 5, 10
ลองทุกชุด 4 ตัวที่รวมได้ 10:
5+2+2+1 = 10 → 5×2×2×1 = 20 ← สูงสุด 5+5+?+? → เกิน 10 10+... → เกิน 10
Output: 20
N = 16
ตัวประกอบ: 1, 2, 4, 8, 16
4+4+4+4 = 16 → 4×4×4×4 = 256 ← สูงสุด
Output: 256
แนวทางแก้ปัญหา (Brute Force บนตัวประกอบ)
- หาตัวประกอบทั้งหมดของ N → เก็บใน array
factors[] - วนลูป 4 ชั้น (i,j,k,l) บน index ของ factors[]
- ถ้า
factors[i]+factors[j]+factors[k]+factors[l] == Nคำนวณผลคูณ - เก็บค่าสูงสุด
ตัวอย่างโค้ด (แก้ไขจากต้นฉบับ)
#include <bits/stdc++.h>
using namespace std;
vector<int> findFactors(int N) {
vector<int> factors;
for (int i = 1; i * i <= N; i++) {
if (N % i == 0) {
factors.push_back(i);
if (i != N / i) factors.push_back(N / i);
}
}
return factors;
}
int maxProductFourFactors(int N) {
vector<int> factors = findFactors(N);
int maxProd = 0;
int sz = factors.size();
for (int i = 0; i < sz; i++)
for (int j = 0; j < sz; j++)
for (int k = 0; k < sz; k++)
for (int l = 0; l < sz; l++) {
int sum = factors[i] + factors[j] + factors[k] + factors[l];
if (sum == N) {
int prod = factors[i] * factors[j] * factors[k] * factors[l];
maxProd = max(maxProd, prod);
}
}
return maxProd;
}
int main() {
int N = 10;
cout << "Max product: " << maxProductFourFactors(N) << endl;
N = 16;
cout << "Max product: " << maxProductFourFactors(N) << endl;
return 0;
}
ผลลัพธ์
Max product: 20 Max product: 256
การปรับปรุงประสิทธิภาพ
ลูป 4 ชั้นเป็น O(F⁴) โดย F = จำนวนตัวประกอบ (สำหรับ N ≤ 10⁵, F ≤ ~128 ยังทำงานได้เร็ว)
สามารถลดเหลือ O(F³) โดยคำนวณตัวที่ 4: l_val = N - (a+b+c) แล้วเช็คว่าเป็น factor หรือไม่ (ใช้ hash set)
ข้อสังเกตจากโค้ดต้นฉบับ
- โค้ดต้นฉบับมี bug:
int size = K+1แต่ K คือตัวนับจำนวน factors → ควรเป็นKไม่ใช่K+1 - ใช้ global array
Factors[30]ขนาดคงที่ – ควรใช้ vector - Output บอก "Maximum Profit: 20" แทน "Max product" – คัดลอกผิด
ข้อคิดเพิ่มเติม (Mathematical Insight)
จาก AM-GM: ผลคูณ 4 ตัวที่มีผลรวมคงที่ = N จะมากที่สุดเมื่อ 4 ตัวเท่ากันคือ N/4
แต่ต้องเป็นตัวประกอบของ N → คำตอบคือ "ตัวประกอบที่ใกล้ N/4 มากที่สุด" ใช้ซ้ำ 4 ครั้ง (ถ้ารวมได้ N)
เช่น N=16, N/4=4 → 4 เป็นตัวประกอบ → 4×4×4×4=256
N=10, N/4=2.5 → ตัวประกอบใกล้ที่สุดคือ 2 และ 5 → 5+2+2+1=10 (ใช้ 5,2,2,1)