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.
Ya, itu setara dengan masalah ransel. Pertimbangkan waktu akhir pekerjaan dan persiapkan meja seperti ransel. Sebelum membaca solusi berikut, silakan periksa masalah knapsack dan solusinya.
Anda juga dapat mencetak pekerjaan yang dijadwalkan dengan melintasi tabel:
Kompleksitas sama dengan masalah ransel.
sumber