码迷,mamicode.com
首页 > 移动开发 > 详细

uva 10498 Happiness(线性规划)

时间:2015-10-30 18:56:46      阅读:351      评论:0      收藏:0      [点我收藏+]

标签:

题意: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;
}

 

uva 10498 Happiness(线性规划)

标签:

原文地址:http://www.cnblogs.com/dominatingdashuzhilin/p/4924084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!