线性规划

  int find(){
    LDB maxi=-1e15;int po;
    for (int i=1;i<=ycnt;i++)
      if (ans[i]>maxi){
        maxi=ans[i];po=i;
      }
    if (maxi<eps) return(0);
    int tar=po;maxi=1e15;
    for (int i=1;i<=xcnt;i++)
      if ((lim[i][tar])>eps&&lim[i][0]/lim[i][tar]<maxi){
          maxi=lim[i][0]/lim[i][tar];po=i;
      }
    if (maxi==1e15){
      ans[0]=-1e12;return(0);
    }
    for (int i=0;i<=ycnt;i++){
      LDB t=lim[po][i];lim[po][i]=lim[1][i];lim[1][i]=t;
    }
    return(tar);
  }

  void work(){
      while (int po=find()){
          
        for (int i=2;i<=xcnt;i++)
        if (fabs(lim[i][po])>eps){
          LDB bas=lim[i][po]/lim[1][po]; lim[i][po]=0;
          for (int j=0;j<=ycnt;j++)
            lim[i][j]-=lim[1][j]*bas;    
        }
        LDB bas=ans[po]/lim[1][po]; ans[po]=0;
        for (int j=0;j<=ycnt;j++)
          ans[j]-=lim[1][j]*bas;
    }
  }

注意po那一列需要消2倍

原文地址:https://www.cnblogs.com/zhujiangning/p/6354454.html