Thuật toán tham lam không thể giúp đỡ trong trường hợp đó. Và nó không thể được so sánh với cả hai vấn đề ba lô hoặc 0-1. Đầu tiên có thể được giải quyết bằng thuật toán tham lam trong O (n) và thứ hai là NP.
Vấn đề bạn gặp phải có thể bị ép buộc trong O (2 ^ n). Nhưng bạn có thể tối ưu hóa nó bằng cách sử dụng lập trình động.
1) Sắp xếp các khoảng thời gian theo thời gian bắt đầu.
2) Khởi tạo int [] cost = new int [jobs.length] bằng Integer.MIN_VALUE (hoặc bất kỳ giá trị âm nào);
3) Xác định theo thói quen đệ quy (ở đây là Java):
private int findCost(Job[] jobs, int k, int[] costs) {
if(k >= jobs.length) {
return 0;
}
if(costs[k] < 0) {
int x = findNextCompatibleJob(jobs, k);
int sumK = jobs[k].cost + findCost(jobs, x, costs);
int sumK1 = findCost(jobs, k + 1, costs);
costs[k] = Math.max(sumK, sumK1);
}
return costs[k];
}
private int findNextCompatibleJob(Job[] jobs, int k) {
int finish = jobs[k].finish;
for(int i = k + 1; i < jobs.length; i++) {
if(jobs[i].start > finish) {
return i;
}
}
return Integer.MAX_VALUE;
}
4) Bắt đầu đệ quy với k = 0;
Tôi đã thực hiện chỉ quy trình đệ quy trong khi các phần khác là tầm thường. Tôi đã xem xét rằng bất kỳ chi phí nào là> = 0. Nếu có thể có các công việc chi phí âm, chúng ta cần thêm kiểm tra cho điều đó và chỉ cần vượt qua các công việc đó mà không cần xem xét.