题目大意:商店里有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;
}