在此问题中,给出了一份作业列表。在列表中,还列出了每个工作的截止日期和利润。每个工作将占用一个单位时间,因此,一个工作的最短期限是1。如果一次只能安排一个工作,则可以最大程度地提高利润。
为了解决该问题,生成作业组的所有子集以检查单个子集是否可行。此外,跟踪已生成的所有可行子集的最大利润。
该算法的时间复杂度为O(n ^ 2)
Input: A list of jobs with job id, deadline and profit. And the number of jobs n. {('a', 2, 100), ('b', 1, 19), ('c', 2, 27), ('d', 1, 25), ('e', 3, 15)} n = 5 Output: Following is maximum profit sequence of job sequence: c a e
jobSequence(jobList, n)
输入-作业列表以及列表中存在的作业数。
输出-顺序,如何进行作业。
Begin sort the jobs in jobList according to their profit create a list of job sequence and slot to track free time slots initially make all slots are free for all given jobs i do for all jobs in the list from ending of the list do if slot[j] is free then jobSequence[j] := i make slot[j] := fill break the loop done done for all slots when it is not free do print id of job using jobList[jobSequence[i]] done End
#include<iostream> #include<algorithm> using namespace std; struct Job { char id; int deadLine; int profit; }; bool comp(Job j1, Job j2) { return (j1.profit > j2.profit); //compare jobs based on profit } int min(int a, int b) { return (a<b)?a:b; } void jobSequence(Job jobList[], int n) { sort(jobList, jobList+n, comp); //sort jobList on profit int jobSeq[n]; // To store result (Sequence of jobs) bool slot[n]; // To keep track of free time slots for (int i=0; i<n; i++) slot[i] = false; //initially all slots are free for (int i=0; i<n; i++) { //for all given jobs for (int j=min(n, jobList[i].deadLine)-1; j>=0; j--) { //search from last free slot if (slot[j]==false) { jobSeq[j] = i; // Add this job to job sequence slot[j] = true; // mark this slot as occupied break; } } } for (int i=0; i<n; i++) if (slot[i]) cout << jobList[jobSeq[i]].id << " "; //display the sequence } int main() { Job jobList[] = {{'a',2,100}, {'b',1,19}, {'c',2,27},{'d',1,25},{'e',3,15}}; int n = 5; cout << "Following is maximum profit sequence of job sequence: "; jobSequence(jobList, n); }
输出结果
Following is maximum profit sequence of job sequence: c a e