- Trending Categories
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
Physics
Chemistry
Biology
Mathematics
English
Economics
Psychology
Social Studies
Fashion Studies
Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Find Jobs involved in Weighted Job Scheduling in C++
Suppose we have a list of N jobs where each job has three parameters. 1. Start Time 2. Finish Time 3. Profit We have to find a subset of jobs associated with maximum profit so that no two jobs in the subset overlap.
So, if the input is like N = 4 and J = {{2, 3, 55},{4, 6, 25},{7, 20, 150},{3, 150, 250}} , then the output will be [(2, 3, 55),(3, 150, 250)] and optimal profit 305
To solve this, we will follow these steps −
Define a function find_no_conflict(), this will take an array jobs, index,
left := 0, right := index - 1
while left <= right, do −
mid := (left + right) / 2
if jobs[mid].finish <= jobs[index].start, then −
if jobs[mid + 1].finish <= jobs[index].start, then −
left := mid + 1
return mid
return mid
Otherwise
right := mid - 1
return -1
From the main method, do the following −
sort the array job_list based on finish time
make a table for jobs called table of size n
table[0].value := job_list[0].profit
insert job_list[0] at the end of table[0]
for initialize i := 1, when i < n, update (increase i by 1), do −
include_profit := job_list[i].profit
l := find_no_conflict(job_list, i)
if l is not equal to - 1, then −
include_profit := include_profit + table[l].value
if include_profit > table[i - 1].value, then −
table[i].value := include_profit
table[i].job := table[l].job
insert job_list[i] at the end of of table[i]
Otherwise
table[i] := table[i - 1]
display jobs from table
display Optimal profit := table[n - 1].value
Example (C++)
Let us see the following implementation to get better understanding −
#include <bits/stdc++.h> using namespace std; class Job { public: int start, finish, profit; }; struct job_with_weight { vector<Job> job; int value; }; bool jobComparator(Job s1, Job s2) { return (s1.finish < s2.finish); } int find_no_conflict(Job jobs[], int index) { int left = 0, right = index - 1; while (left <= right) { int mid = (left + right) / 2; if (jobs[mid].finish <= jobs[index].start) { if (jobs[mid + 1].finish <= jobs[index].start) left = mid + 1; else return mid; } else right = mid - 1; } return -1; } int get_max_profit(Job job_list[], int n) { sort(job_list, job_list + n, jobComparator); job_with_weight table[n]; table[0].value = job_list[0].profit; table[0].job.push_back(job_list[0]); for (int i = 1; i < n; i++) { int include_profit = job_list[i].profit; int l = find_no_conflict(job_list, i); if (l != - 1) include_profit += table[l].value; if (include_profit > table[i - 1].value){ table[i].value = include_profit; table[i].job = table[l].job; table[i].job.push_back(job_list[i]); } else table[i] = table[i - 1]; } cout << "["; for (int i=0; i<table[n-1].job.size(); i++) { Job j = table[n-1].job[i]; cout << "(" << j.start << ", " << j.finish << ", " << j.profit << "),"; } cout << "]\nOptimal profit: " << table[n - 1].value; } int main() { Job arr[] = {{2, 3, 55},{4, 6, 25},{7, 20, 150},{3, 150, 250}}; int n = sizeof(arr)/sizeof(arr[0]); get_max_profit(arr, n); }
Input
{{2, 3, 55},{4, 6, 25},{7, 20, 150},{3, 150, 250}}
Output
[(2, 3, 55),(3, 150, 250),] Optimal profit: 305