查找 C++ 中加权作业调度相关的职位
假设我们有一个包含 N 个作业的列表,每个作业有三个参数:1. 开始时间 2. 结束时间 3. 利润。我们需要找到一个与最大利润相关的作业子集,使得子集中没有两个作业重叠。
因此,如果输入类似于 N = 4 且 J = {{2, 3, 55},{4, 6, 25},{7, 20, 150},{3, 150, 250}},则输出将为 [(2, 3, 55),(3, 150, 250)],最优利润为 305。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数 find_no_conflict(),它将接收一个作业数组 jobs 和索引 index 作为输入。
left := 0, right := index - 1
当 left <= right 时,执行以下操作:
mid := (left + right) / 2
如果 jobs[mid].finish <= jobs[index].start,则执行以下操作:
如果 jobs[mid + 1].finish <= jobs[index].start,则执行以下操作:
left := mid + 1
返回 mid
返回 mid
否则
right := mid - 1
返回 -1
在主方法中,执行以下操作:
根据结束时间对数组 job_list 进行排序。
创建一个名为 table 的作业表,大小为 n。
table[0].value := job_list[0].profit
将 job_list[0] 插入到 table[0] 的末尾。
从 i := 1 开始,当 i < n 时,更新 i(增加 1),执行以下操作:
include_profit := job_list[i].profit
l := find_no_conflict(job_list, i)
如果 l 不等于 -1,则执行以下操作:
include_profit := include_profit + table[l].value
如果 include_profit > table[i - 1].value,则执行以下操作:
table[i].value := include_profit
table[i].job := table[l].job
将 job_list[i] 插入到 table[i] 的末尾。
否则
table[i] := table[i - 1]
显示 table 中的作业。
显示最优利润 := table[n - 1].value
示例(C++)
让我们看看以下实现,以便更好地理解:
#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); }
输入
{{2, 3, 55},{4, 6, 25},{7, 20, 150},{3, 150, 250}}
输出
[(2, 3, 55),(3, 150, 250),] Optimal profit: 305