题目描述
Lapro又要买书了,他认真地列出了书单,并且书单上每种书只买一本,他希望能够花最少的钱买到所有想买的书。
于是他对各家书店的每种书的价格经行了一番调查,并做出表格。由于数据量太大,他希望你能帮助他编写程序,并且告诉他买到书单上所有的书所需要的最少的钱数。
输入
第一行两个整数:N,M(1<=N,M<=100),N表示要买的书的数量,书分别以1,2,3,……N编号,M表示调查的书店的个数,这些店以1,2,……M编号。
接下来M行,每行N个实数,第i行第j列表示在第i家书店买到第j本书所需要花费的钱数。
输出
一个实数,表示买到所有书最少要花多少钱,结果保留到2位小数。
样例输入
2 3
1.0 2.0
2.0 10.0
1.5 1.0
样例输出
2.00
#include<stdio.h>
int main()
{
int i,j,N,M;
float sum=0.0,min,k,t; //min保存每本书所需最小价格
float a[110][110]; //k,t处理特殊情况
scanf("%d%d",&N,&M);
if(N==1&&M==1){ //只买一本书且只有一个书店的情况
scanf("%f",&k);
printf("%.2f",k);
return 0;
}
if(N==1&&M==2) //一本书两个书店的情况只能选择较小的
{
scanf("%f\n",&k);
scanf("%f",&t);
if(k>t)
printf("%.2f",t);
else printf("%.2f",k);
return 0;
}
if(N==2&&M==1) //一个书店两本书,将两本书价格相加
{
scanf("%f%f",&k,&t);
printf("%.2f",k+t);
return 0;
}
for(i=0;i<M;i++) //两本书两个书店及以上情况
{ //运用二维数组解决
for(j=0;j<N;j++)
{
scanf("%f",&a[i][j]); //输入M行N列数组
}
}
for(j=0;j<N;j++)
{
min=a[0][j]; //将第1行各元素作为该列的初始最小值
for(i=1;i<M;i++)
{
if(a[i][j]<min) //如果小于第一个值
min=a[i][j]; //则将min重新赋值
}
sum=sum+min; //将各列最小值相加
}
printf("%.2f",sum); //输出
return 0;
}