标签:
题意:n种食物m个人,已知每种食物的单价,每个人吃每种食物的愉快值,每个人的愉快值上限,求花钱买食物所花钱的最大值;
思路:线性规划;可得标准形式,带入模版;
标准形式即由不等式构成的方程组,松弛形式即由等式构成的方程组;
等式转不等式,用既大于等于又小于等于表示;不等式转等式,用增加一个变量,新增变量大于0来表示;
#include <iostream> #include <cstdio> #include <math.h> using namespace std; const double dinf=1e10; const int MAX=55; int n,m,B[MAX],N[MAX]; double A[MAX][MAX],b[MAX],c[MAX],v; double ans[MAX]; int sgn(double x) { if(x>1e-8) return 1; if(x<-1e-8) return -1; return 0; } void init() { int i,j; for(i=1;i<=n;i++) N[i]=i; for(i=1;i<=m;i++) B[i]=n+i; v=0; } void pivot(int l,int e) //主元,输入松弛型线性规划 { int i,j; double temp=A[l][e]; b[l]/=temp; A[l][e]=1/temp; for(i=1;i<=n;i++) if(i!=e) A[l][i]/=temp; for(i=1;i<=m;i++) if(i!=l) { b[i]-=A[i][e]*b[l]; for(j=1;j<=n;j++) if(j!=e) A[i][j]-=A[i][e]*A[l][j]; A[i][e]=-A[i][e]/temp; } v+=b[l]*c[e]; for(i=1;i<=n;i++) if(i!=e) c[i]-=c[e]*A[l][i]; c[e]*=-A[l][e]; swap(B[l],N[e]); } void simplex() //单纯型法,输入标准型线性规划 { int i,j,k,x; int l,s; double temp,temp1,temp2,temp3; while(1) { temp2=-dinf; s=-1; for(i=1;i<=n;i++) if(sgn(c[i])>0) { temp=dinf; for(k=1;k<=m;k++) if(sgn(A[k][i])>0) { temp3=b[k]/A[k][i]; if(temp3<temp) temp=temp3,x=k; } if(temp2<temp*c[i]) { s=i,l=x,temp2=temp*c[i]; } } if(s==-1) break; pivot(l,s); } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) if(B[j]==i) break; if(j<=m) ans[i]=b[j]; else ans[i]=0; } } int main() { while(scanf("%d%d",&n,&m)!=-1) { int i,j; for(i=1;i<=n;i++) scanf("%lf",&c[i]); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) scanf("%lf",&A[i][j]); scanf("%lf",&b[i]); } init(); simplex(); printf("Nasa can spend %.0lf taka.\n",ceil(v*m)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/dominatingdashuzhilin/p/4924084.html