在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(),它将使用数组作业,索引,
左:= 0,右:=索引-1
而左<=右,则执行-
右:=中-1
如果Jobs [mid + 1] .finish <= Jobs [index] .start,则-
返回中
左:=中+ 1
返回中
中:=(左+右)/ 2
如果Jobs [mid] .finish <= Jobs [index] .start,则-
除此以外
返回-1
从主要方法中,执行以下操作-
根据完成时间对数组job_list进行排序
为工作表创建一个大小为n的表
table [0] .value:= job_list [0] .profit
在表[0]的末尾插入job_list [0]
对于初始化i:= 1,当i <n时,更新(将i增加1),-
table [i]:= table [i-1]
table [i] .value:= include_profit
table [i] .job:= table [l] .job
在表[i]的末尾插入job_list [i]
include_profit:= include_profit + table [l] .value
include_profit:= job_list [i] .profit
l:= find_no_conflict(job_list,i)
如果l不等于-1,则-
如果include_profit> table [i-1] .value,则-
除此以外
显示表格中的作业
显示最佳利润:= 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
以上是 在C ++中查找与加权作业计划有关的作业 的全部内容, 来源链接: utcz.com/z/354943.html