贪心法之非单位时间任务安排问题代码

#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   {
    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 {
  cout<<"please put your "<  cin>>tsk[m].kk[0];  
  cout<<"please put your "<  cin>>tsk[m].kk[1];
  cout<<"please put your "<  cin>>tsk[m].kk[2];
 }
 //给工作的惩罚排序 给惩罚重大到小排序
 for(m=0;m {
  tt[m]=tsk[m].kk[1];
 }
 
 merge_sort(tt,0,n);
 //由于2路归并排序的结果是降许下面给他们 进行颠倒 变成升序
 int q=n;
 int pp[99];
 for (m=0;m {
  q=q-1;
  pp[m]=tt[q];  
 }

 for (int i=0;i=0;i--
 { 
  for (m=0;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 {
  cout<  cout<  cout< }
   d=tsk[n-1].kk[1];//记录最大截止时间
  
  
   for(i=0;i   {
      for(int j=0;j<=d;j++)
        f[i][j]=9999;

   }

 dyna();
    cout<

}

你可能感兴趣的:(贪心法之非单位时间任务安排问题代码)