NOJ-1155-A-买书

题目描述

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;
}

你可能感兴趣的:(noj-买书-算法)