带时限的作业排序问题----经典问题

【题目描述】
设有一个单机系统、无其它资源限制且每个作业运行相等时间,不妨假定每个作业运行1个单位时间。现有n(00,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
#include
#include
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;
}

你可能感兴趣的:(算法分析)