Algoritma serakah tidak dapat membantu dalam kasus itu. Dan itu tidak bisa dibandingkan dengan masalah fraksional atau 0-1. Yang pertama bisa diselesaikan dengan algoritma serakah di O (n) dan yang kedua adalah NP.
Masalah yang Anda miliki bisa menjadi kasar di O (2 ^ n). Tetapi Anda bisa mengoptimalkannya menggunakan pemrograman dinamis.
1) Urutkan interval dengan waktu mulai.
2) Inisialisasi int [] biaya = int baru [jobs.length] dengan Integer.MIN_VALUE (atau nilai negatif apa pun);
3) Tentukan mengikuti rutin rekursif (di sini adalah 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) Mulai rekursi dengan k = 0;
Saya hanya menerapkan rutin rekursi sementara bagian lainnya sepele. Saya menganggap bahwa biaya apa pun>> 0. Jika mungkin ada pekerjaan dengan biaya negatif, kita perlu menambahkan cek untuk itu dan hanya meneruskan pekerjaan itu tanpa pertimbangan.