C++非单位时间任务安排问题

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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值