C++非单位时间任务安排问题
问题描述
具有截止时间和误时惩罚的任务安排问题可描述如下。
(1) 给定 n 个任务的集合 S={1,2,…,n};
(2) 完成任务i需要ti 时间,1≤i≤n;
(3) 任务 i 的截止时间 di ,1≤i≤n,即要求任务 i 在时间 di 之前结束;
(4) 任务 i 的误时惩罚 wi ,1≤i≤n,即任务 i 未在时间di 之前结束将招致 wi 的惩罚;
若按时完成则无惩罚。
任务安排问题要求确定 S 的一个时间表(最优时间表)使得总误时惩罚达到最小。
对于给定的 n 个任务,编程计算总误时惩罚最小的最优时间表。
数据输入:
第 1 行是 1 个正整数 n,表示任务数。接下来的 n 行中,每行有 3 个正整数 a,b,c,表示完成相应任务需要时间 a,截止时间为 b,误时惩罚为 c。
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits.h>
using namespace std;
struct TASK{
int needTime;
int deadline;
int punishment;
TASK() :needTime(), deadline(), punishment() {};
TASK(int n, int d, int p) :needTime(n), deadline(d), punishment(p) {};
};
class Main {
private:
int n, d;
vector<TASK> tsk;
vector<vector<int>> f;
public:
void init()
{
cin >> n;
tsk.resize(n);
for (int i = 0; i < n; i++) {
int n, d, p;
cin >> n >> d >> p;
TASK t(n, d, p);
tsk[i]=t;
}
sort(tsk.begin(), tsk.end(), [](TASK a, TASK b) {
return a.deadline < b.deadline;
});
d = tsk[n - 1].deadline;
f.resize(n);
for (int i = 0; i < n; i++)
{
f[i].resize(d + 1);
for (int j = 0; j <= d; j++)
f[i][j] = INT_MAX;
}
}
void dynamic()
{
for (int i = 0; i <= d; i++)
if (tsk[0].needTime <= i)
f[0][i] = 0;
else
f[0][i] = tsk[0].punishment;
for (int i = 1; i < n; i++) {
for (int j = 0; j <= d; j++) {
f[i][j] = f[i - 1][j] + tsk[i].punishment;
int jj = tsk[i].deadline > j ? j : tsk[i].deadline;
if (jj >= tsk[i].needTime && f[i][j] > f[i - 1][jj - tsk[i].needTime])
f[i][j] = f[i - 1][jj - tsk[i].needTime];
}
}
cout << f[n - 1][d];
}
};
int main()
{
Main *m = new Main();
m->init();
m->dynamic();
}