#include "iostream.h"
#include "stdio.h"
int n; //定义工作数
int tt[99];
int f[99][99];
int d; //最大需求时间
//结构体数组
struct tsk
{
int kk[3];
}tsk[99];
struct pass
{
int pp[3];
}pass[99];
//归并排序
void merge(int data[], int p, int q, int r)
{
int i, j, k, n1, n2;
n1 = q - p + 1;
n2 = r - q;
int L[99];
int R[99];
for(i = 0, k = p; i < n1; i++, k++)
L[i] = data[k];
for(i = 0, k = q + 1; i < n2; i++, k++)
R[i] = data[k];
for(k = p, i = 0, j = 0; i < n1 && j < n2; k++)
{
if(L[i] > R[j])
{
data[k] = L[i];
i++;
}
else
{
data[k] = R[j];
j++;
}
}
if(i < n1)
{
for(j = i; j < n1; j++, k++)
data[k] = L[j];
}
if(j < n2)
{
for(i = j; i < n2; i++, k++)
data[k] = R[i];
}
}
void merge_sort(int data[], int p, int r)
{
if(p < r)
{
int q = (p + r) / 2;
merge_sort(data, p, q);
merge_sort(data, q + 1, r);
merge(data, p, q, r);
}
}
void dyna()
{
for(int i=0;i<=d;i++)
if(tsk[0].kk[0]<=i)
f[0][i]=0;
else
f[0][i]= tsk[0].kk[2];
for(i=1;i<n;i++)
{
for(int j=0;j<=d;j++)
{
f[i][j]= f[i-1][j]+tsk[i].kk[2];
int jj=tsk[i].kk[1]>j?j:tsk[i].kk[1];
if(jj>tsk[i].kk[0]&& f[i][j]>f[i-1][jj-tsk[i].kk[0]])
f[i][j]=f[i-1][jj-tsk[i].kk[0]];
}
}
}
void main()
{
cout<<"please put your work num \n";
cin>>n; //工作数
for(int m=0;m<n;m++)
{
cout<<"please put your "<<m+1<<" work 需要时间 \n";
cin>>tsk[m].kk[0];
cout<<"please put your "<<m+1<<" work 截止时间 \n";
cin>>tsk[m].kk[1];
cout<<"please put your "<<m+1<<" work 超时的惩罚 \n";
cin>>tsk[m].kk[2];
}
//给工作的惩罚排序 给惩罚重大到小排序
for(m=0;m<n;m++)
{
tt[m]=tsk[m].kk[1];
}
merge_sort(tt,0,n);
//由于2路归并排序的结果是降许下面给他们 进行颠倒 变成升序
int q=n;
int pp[99];
for (m=0;m<n;m++)
{
q=q-1;
pp[m]=tt[q];
}
for (int i=0;i<n;i++)// i=n-1;i>=0;i--
{
for (m=0;m<n;m++)
{
if (pp[i]==tsk[m].kk[1])
{ //把找到递曾的顺序 依次交换 pass为变量传递使用
pass[i].pp[0]=tsk[i].kk[0];
pass[i].pp[1]=tsk[i].kk[1];
pass[i].pp[2]=tsk[i].kk[2];
tsk[i].kk[0]=tsk[m].kk[0];
tsk[i].kk[1]=tsk[m].kk[1];
tsk[i].kk[2]=tsk[m].kk[2];
tsk[m].kk[0]=pass[i].pp[0];
tsk[m].kk[1]=pass[i].pp[1];
tsk[m].kk[2]=pass[i].pp[2];
}
}
}
for(m=0;m<n;m++)
{
cout<<tsk[m].kk[0]<<"\n";
cout<<tsk[m].kk[1]<<"\n";
cout<<tsk[m].kk[2]<<"\n";
}
d=tsk[n-1].kk[1];//记录最大截止时间
for(i=0;i<n;i++)
{
for(int j=0;j<=d;j++)
f[i][j]=9999;
}
dyna();
cout<<f[n-1][d]<<"\n";
}