hihocoder1195

题目大意:商店里有n种商品,有m种购买组合及每种的的总价,求每种商品的单价,判断多解,无解情况。

分析: 高斯消元求解线性方程组。。。。

代码:

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
double A[1010][1010];
const double e=1e-6;
int f(double x){
    if(x<e&&x>-e) return 0;
    else return 1;
}
int main(){
     int j,i,n,m;
     while(scanf("%d%d",&n,&m)!=EOF){
     for(i=0;i<m;i++){
         for(j=0;j<=n;j++) scanf("%lf",&A[i][j]);
     }
     int ans=0;
     for(i=0;i<n;i++){
        int k=-1;
        for(j=i;j<m;j++) if(f(A[j][i])) k=j;
        if(k!=-1) for(j=0;j<=n;j++) swap(A[i][j],A[k][j]);
        else{
            ans=1;    //消去第i个未知数时,第i~m行不存在非0系数
            break;
        }
        for(j=i+1;j<m;j++){
            double a=A[j][i]/A[i][i];      //消去第i个未知数,构造上三角矩阵
            for(k=i;k<=n;k++) A[j][k]-=a*A[i][k];
        }
     }
     if(ans==1) printf("Many solutions\n");
     else{
          for(i=0;i<m;i++){
              int x=1;
              for(j=0;j<n;j++) if(f(A[i][j])) x=0;
              if(x&&f(A[i][n])) ans=2;              //左边系数均为0,但方程组右边不为0,无解
          }
          if(ans==2) printf("No solutions\n");
          else{
              for(i=n-1;i>=0;i--){                //从第n行倒推回第1行,A[i][n]储存第i个未知数的解
                  for(j=i+1;j<n;j++){        
                       A[i][n]-=A[j][n]*A[i][j];
                  }
                  A[i][n]/=A[i][i];
              }
              for(i=0;i<n;i++){
                  int x=A[i][n]+0.5;
                  printf("%d\n",x);
             }
          }
     }
     }
     return 0;
}

猜你喜欢

转载自blog.csdn.net/guogai13/article/details/81772186