HihoCoder - 1195 高斯消元

描述

小Ho:喂不得了啦,那边便利店的薯片半价了!

小Hi:啥?!

小Ho:那边的便利店在打折促销啊。

小Hi:走走走,赶紧去看看=v=

于是小Hi和小Ho来到了便利店。

老板为了促销,推出了组合包的形式,将不同数量的各类商品打包成一个组合,顾客可以选择组合进行购买。比如2袋薯片,1听可乐的组合只要5元,而1袋薯片,2听可乐的组合只要4元。

通过询问老板,小Hi和小Ho知道:一共有N种不同的商品和M种不同的商品组合;每一个组合的价格等于组合内商品售价之和,一个组合内同一件商品不会超过10件。

小Hi:这样算下来的话,一听可乐就是1元,而一包薯片是2元。小Ho,如果你知道所有的组合情况,你能分别算出每一件商品单独的价格么?

小Ho:当然可以了,这样的小问题怎么能难到我呢?

   

提示:高斯消元

 

输入

第1行:2个正整数,N,M。表示商品的数量N,组合的数量M。1≤N≤500, N≤M≤2*N

第2..M+1行:N+1个非负整数,第i+1行第j列表示在第i个组合中,商品j的数量a[i][j]。第i+1行第N+1个数表示该组合的售价c[i]。0≤a[i][j]≤10, 0≤c[i]≤10^9

输出

若没有办法计算出每个商品单独的价格,输出"No solutions"。

若可能存在多个不同的结果,输出"Many solutions"。

若存在唯一可能的结果,输出N行,每行一个非负整数,第i行表示第i个商品单独的售价。数据保证如果存在唯一解,那么解一定恰好是非负整数解。

Sample Input

2 2
2 1 5
1 2 4

Sample Output

2
1

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 
 7 using namespace std;
 8 
 9 double a[1005][505],x[505],b[1005];
10 int n,m;
11 const double fbs=1e-6;
12 
13 int guass()
14 {
15     bool flag=false,flag1=false,no=false;
16     for(int i=1;i<=n;i++)
17             {
18             flag=false;
19             for(int j=i;j<=m;j++)
20             {
21                 if(a[j][i]!=0)
22                 {
23                     for(int k=1;k<=n;k++)
24                         swap(a[i][k],a[j][k]);
25                     swap(b[i],b[j]);            
26                     flag=true;
27                     break;
28                 }
29             }
30             if(!flag)
31             {
32                 printf("Many solutions\n");
33                 return 0;
34             }
35             for(int j=i+1;j<=m;j++)
36             {
37                 double bb=a[j][i]/a[i][i];
38                 for(int k=i;k<=n;k++)
39                     a[j][k]=a[j][k]-a[i][k]*bb;
40                 b[j]=b[j]-b[i]*bb;
41             }
42         }
43         for(int i=1;i<=m;i++)
44         {
45             flag1=false;
46             for(int j=1;j<=n;j++)
47                 if(a[i][j]<-fbs || a[i][j]>fbs)
48                 {
49                     flag1=true;
50                     break;
51                 }
52             if(!flag1&&(b[i]>fbs || b[i]<-fbs))
53             {
54                 printf("No solutions\n");
55                   return 0;
56             }
57         }
58         for(int i=n;i>0;i--)
59         {
60             for(int j=i+1;j<=n;j++)
61             {
62                 b[i]=b[i]-a[i][j]*x[j];
63                 a[i][j]=0;
64             }
65             x[i]=b[i]/a[i][i];
66         }    
67         return 1;
68 }
69 
70 int main()
71 {
72     while(~scanf("%d%d",&n,&m))
73     {
74         for(int i=1;i<=m;i++)
75         {
76             for(int j=1;j<=n;j++)
77                 scanf("%lf",&a[i][j]);
78             scanf("%lf",&b[i]);
79         }
80         int f=guass();
81         if(f==1)
82         {
83             for(int i=1;i<=n;i++)
84                 printf("%d\n",(int)(x[i]+0.5));
85         }
86     }
87     
88     return 0;
89 }

 

posted @ 2017-08-18 08:47  西北会法语  阅读(199)  评论(0编辑  收藏  举报