RT,网上贺来的板子,但是不知道为什么有时求出的解并不符合限制。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
const int m=20;//不等式组个数
const int n=20;//变元个数
db M=1e99;
db A[m][n];//记录方程组的数目和系数
db C[n];//存储目标函数中各个变量的系数
db b[m];//存储约数条件中的常数
db CB[m],seta[m],dt[n],x[n];
int num[m];
db ZB=0;
int solve1()
{
int k=0;
bool flag=0;
db mx=0;
for(int i=0;i<n;i++)
if(dt[i]<=0) flag=1;
else {flag=0; break;}
if(flag==1) return -1;
for(int i=0;i<n;i++)
if(mx<dt[i])
{
mx=dt[i];
k=i;
}
return k;
}
int solve2(int a)
{
bool flag=0;
db mn;
int k=a,j=0;
for(int i=0;i<m;i++)
if(A[i][k]<=0) flag=1;
else{flag=0; break;}
if(flag==1)
{
printf("\n该线性规划无最优解\n");
return -1;
}
for(int i=0;i<m;i++)
{
if(A[i][k]>0) seta[i]=b[i]/A[i][k];
else seta[i]=M;
}
mn=M;
for(int i=0;i<m;i++)
if(mn>=seta[i])
{
mn=seta[i];
j=i;
}
num[j]=k+1;
CB[j]=C[k];
return j;
}
void solve3(int p,int q)
{
int c=p,l=q;//行、列号
db t1,t2,t3;
t1=A[c][l];
b[c]=b[c]/t1;
for(int j=0;j<n;j++) A[c][j]=A[c][j]/t1;
for(int i=0;i<m;i++)
{
if(i!=c)
if(A[i][l]!=0)
{
t2=A[i][l];
b[i]=b[i]-b[c]*t2;
for(int j=0;j<n;j++)
A[i][j]=A[i][j]-A[c][j]*t2;
}
}
t3=dt[l];
for(int i=0;i<n;i++) dt[i]=dt[i]-A[c][i]*t3;
}
void print()
{
printf("\n__________________________________\n");
for(int i=0;i<m;i++)
{
printf("%8.2f\tX(%d) %8.2f ",CB[i],num[i],b[i]);
for(int j=0;j<n;j++) printf("%8.2f",A[i][j]); printf("\n");
}
printf("\n__________________________________\n");
printf("\t\t\t");
for(int i=0;i<n;i++) printf(" %8.2f",dt[i]);
printf("\n__________________________________\n");
}
void input()
{
int k;
printf("请输入方程组的系数矩阵 A(%d 行 %d 列):\n",m,n);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%lf",&A[i][j]);
printf("\n请输入初始基变量的数字代码num矩阵:\n");
for(int i=0;i<m;i++) scanf("%d",&num[i]);
printf("\n请输入方程组右边的值矩阵 b:\n");
for(int i=0;i<m;i++) scanf("%lf",&b[i]);
printf("\n请输入目标函数各个变量的系数所构成的系数阵 C:\n");
for(int i=0;i<n;i++) scanf("%lf",&C[i]);
for(int i=0;i<n;i++) dt[i]=C[i];
for(int i=0;i<m;i++)
{
k=num[i]-1;
CB[i]=C[k];
}
}
int main()
{
// freopen("orz.txt","r",stdin);
int p,q;
input();
// printf("\n__________________________________\n");
// printf("\tCB\tXB\tb\t");
// for(int i=0;i<n;i++) printf(" X(%d)\t",i+1);
for(int i=0;i<n;i++) x[i]=0;
printf("\n");
while(1)
{
q=solve1();
if(q==-1)
{
// print();
printf("\n所得解已经是最优解\n");
printf("\n最优解为:\n");
for(int j=0;j<m;j++) x[num[j]-1]=b[j];
for(int i=0;i<n;i++)
{
printf("x%d=%.2lf\n",i+1,x[i]);
ZB=ZB+x[i]*C[i];
}
printf("\n\nZB=%.2lf\n",ZB);
break;
}
print();
p=solve2(q);
// printf("\np=%d, q=%d",p,q);
if(q==-1) break;
solve3(p,q);
}
return 0;
}