设有⼀个单机系统、⽆其它资源限制且每个作业运⾏相等时间,假定每个作业运⾏1个单位时间。现有n(0<n<1000)个作业,每个作业都有⼀个截⽌期限di>0,di为整数,1<=i<=n。如果作业能够在截⽌期限之内完成,可获得pi>0的收益。问题要求得到⼀种作业调度⽅案,该⽅案给出作业的⼀个⼦集和该作业⼦集的⼀种排列,使得若按照这种排列次序调度作业运⾏,该⼦集中的每个作业都能如期完成,并且能够获得最⼤收益。
输入
第⼀⾏⼀个正整数,表⽰n的值;以下n⾏,每⾏三个整数,分别表⽰作业号i,收益pi,截⽌期限di。
输出
第一行:n个作业的一个最优子集
第二行:最大收益
样例输入 Copy
<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">4
1 100 2
2 10 1
3 15 2
4 27 1</span></span></span></span></span></span>
样例输出 Copy
<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">1 4
127</span></span></span></span></span></span>
#include<stdio.h>
typedef struct work{
int ii,p,dd;
}ws;
void Sort(ws *obs,int n)
{
for(int i=n-1;i>0;i--){
for(int j=0;j<i;j++){
if(obs[j].p<obs[j+1].p){
ws temp;
temp=obs[j];
obs[j]=obs[j+1];
obs[j+1]=temp;
}
}
}
}
void Sort2(ws *obs,int n)
{
for(int i=n-1;i>0;i--){
for(int j=0;j<i;j++){
if(obs[j].ii>obs[j+1].ii){
ws temp;
temp=obs[j];
obs[j]=obs[j+1];
obs[j+1]=temp;
}
}
}
}
void Sort1(int *obs,int n)
{
for(int i=n-1;i>0;i--){
for(int j=0;j<i;j++){
if(obs[j]>obs[j+1]){
int temp;
temp=obs[j];
obs[j]=obs[j+1];
obs[j+1]=temp;
}
}
}
}
int main(){
int x;int k=0;
ws w[100],a[100],b[100]={0};
int c[100]={0};
int s[100];int sum=0;
scanf("%d",&x);
for(int i=0;i<x;i++){
scanf("%d %d %d",&w[i].ii,&w[i].p,&w[i].dd);
}
Sort(w,x);
//printf("%d",c[y]);
for(int i=0;i<x;i++){
int y=w[i].dd;
if(c[y]==0){
c[y]=y; s[k]=y;k++;
}
}//printf("%d",k);
Sort1(s,k);
for(int i=0;i<k;i++){
for(int j=0;j<x;j++){
if(w[j].dd==s[i]){
b[i]=w[j];break;
}
}
}
Sort2(b,k);
for(int i=0;i<k;i++){
printf("%d ",b[i].ii);
sum=sum+b[i].p;
}
printf("\n");
printf("%d",sum);
}