Cho 5 biến nguyên: Num, P1, P2, profit_P1, profit_P2. Nhiệm vụ là tối đa hóa lợi nhuận từ tất cả các số tự nhiên trong khoảng [1, Num]. Nếu số chia hết cho P1 thì lợi nhuận tăng profit_P1, nếu chia hết cho P2 thì tăng profit_P2. Lợi nhuận từ một số chỉ được cộng tối đa một lần.
Ví dụ minh họa
Đầu vào: int num = 4, P1 = 6, P2 = 2, profit_P1 = 8, profit_P2 = 2
Đầu ra: Tối đa hóa tổng lợi nhuận = 4
Giải thích: Số từ 1 đến 4. Không số nào chia hết cho 6. Số 2 và 4 chia hết cho 2 → lợi nhuận 2×2 = 4.
Đầu vào: num = 3, P1 = 1, P2 = 2, profit_P1 = 3, profit_P2 = 4
Đầu ra: Tối đa hóa tổng lợi nhuận = 10
Giải thích: 1,2,3 chia hết cho 1. Chỉ 2 chia hết cho 2. Số 2 chia hết cho cả hai → chọn P2 vì lợi nhuận cao hơn (4 > 3). Lợi nhuận: 1,3 cho P1 (2×3=6) + 2 cho P2 (1×4=4) = 10.
Phương pháp tiếp cận
- Cho 6 biến nguyên: Num (khoảng số), P1, P2 (hai người), profit_P1, profit_P2 (lợi nhuận tương ứng)
- Gọi phương thức profitMaximisation() từ main()
- Trong profitMaximisation: Số chia hết cho cả P1 và P2 là bội của LCM(P1,P2). Chỉ nên chia cho người cho lợi nhuận cao hơn.
- Công thức: profit_P1 × (num/P1) + profit_P2 × (num/P2) – min(profit_P1, profit_P2) × (num/LCM(P1,P2))
- Phương thức CalculateGcd() để tính GCD, từ đó ra LCM = (a×b)/GCD(a,b)
- Trả về kết quả về main() hiển thị
Ví dụ mã 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));
}
}
Đầu ra
Maximize the total profit of all the persons X 12