【题目描述】
设有一个单机系统、无其它资源限制且每个作业运行相等时间,不妨假定每个作业运行1个单位时间。现有n(0<n<1000)个作业,每个作业都有一个截止期限di>0,di为整数。如果作业能够在截止期限之内完成,可获得pi>0的收益。问题要求得到一种作业调度方案,该方案给出作业的一个子集和该作业子集的一种排列,使得若按照这种排列次序调度作业运行,该子集中的每个作业都能如期完成,并且能够获得最大收益。
【输入】
第一行输入n的值,以下n行输入作业号i,收益pi,截止期限di。
【输出】
n个作业的一个最优子集。
【输入样例】
4
1 100 2
2 10 1
3 15 2
4 27 1
【输出样例】
1 4
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 20;
struct Work{
int index;
int d;
int p;
};
bool cmp(Work x,Work y){
return x.p>y.p;
}
int JS(Work *work,int *x,int n){
int k = 0;
x[0]=0;
for(int j = 1 ; j < n ;j++){
int r = k;
while(r>=0 && work[x[r]].d>work[j].d && work[x[r]].d>r+1)
r--;
if((r<0 || work[x[r]].d<=work[j].d) && work[j].d>r+1){
for(int i = k ; i >= r+1;i--)
x[i+1]=x[i];
x[r+1]=j;
k++;
}
}
return k;
}
int main(){
int n,x[N];
Work *work= new Work [N];
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>work[i].index>>work[i].p>>work[i].d;
}
sort(work,work+n,cmp);
int k = JS(work,x,n);
int num[N];
for(int i = 0 ; i <= k ; i++){
num[i]=work[x[i]].index;
}
sort(num,num+k+1);
for(int i = 0 ; i <=k;i++)cout<<num[i]<<' ';
return 0;
}