ภาพรวมปัญหา
ได้รับตัวแปร 5 ตัว: Num, P1, P2, profit_P1, profit_P2 ต้องการหากำไรรวมสูงสุดจากจำนวนธรรมชาติทุกตัวในช่วง [1, Num] โดย:
- ถ้าตัวเลขหาร P1 ลงตัว เพิ่มกำไร profit_P1
- ถ้าตัวเลขหาร P2 ลงตัว เพิ่มกำไร profit_P2
- แต่ละตัวเลขนำมาเพิ่มกำไรได้สูงสุด 1 ครั้ง (ถ้าหารทั้ง P1 และ P2 ลงตัว เลือกที่ให้กำไรมากกว่า)
ตัวอย่าง
ตัวอย่างที่ 1
Input: num = 4, P1 = 6, P2 = 2, profit_P1 = 8, profit_P2 = 2
Output: 4
คำอธิบาย: ในช่วง 1-4 ไม่มีตัวเลขไหนหาร 6 ลงตัว แต่ 2 และ 4 หาร 2 ลงตัว → กำไร = 2 × 2 = 4
ตัวอย่างที่ 2
Input: num = 3, P1 = 1, P2 = 2, profit_P1 = 3, profit_P2 = 4
Output: 10
คำอธิบาย: 1,2,3 หาร 1 ลงตัว; 2 หาร 2 ลงตัว; 2 หารทั้งคู่ → เลือกหาร 2 (กำไร 4) ส่วน 1,3 หาร 1 (กำไร 3×2=6) รวม = 10
สูตรคำนวณ
กำไรรวม = profit_P1 × (num / P1) + profit_P2 × (num / P2) − min(profit_P1, profit_P2) × (num / lcm(P1, P2))
โดย lcm(P1, P2) = (P1 × P2) / gcd(P1, P2)
ตัวอย่างโค้ด Java
public class testClass {
static int CalculateGcd(int n1, int n2) {
if (n2 == 0) return n1;
return CalculateGcd(n2, n1 % n2);
}
static int profitMaximisation(int n, int a, int b, int x, int y) {
int result = x * (n / a);
result += y * (n / b);
result -= Math.min(x, y) * (n / ((a * b) / CalculateGcd(a, b)));
return result;
}
public static void main(String[] args) {
int num = 6, P1 = 6, P2 = 2, profit_P1 = 8, profit_P2 = 2;
System.out.println("Maximize the total profit of all the persons X " + profitMaximisation(num, P1, P2, profit_P1, profit_P2));
}
}
ผลลัพธ์
Maximize the total profit of all the persons X 12