C語言——最大效益

明明的爸爸開了一家小公司,公司裏有5名職員。今天,公司接待了5位客戶。明明的爸爸知道,和任何一位客戶談判並簽下合同都要花一整天的時間,而他又希望在一天之內,和這5位客戶都簽好合同。因此,明明的爸爸要求公司裏的5名職員分別與1位客戶談判。

明明的爸爸也知道,這5名職員和5位客戶的性格各不相同。因此,不同的職員與不同的客戶談判,會給公司帶來不同的經濟效益。他現在要做出一個決策,讓5名職員分別與哪位客戶談判,才能讓公司今天的總經濟效益最大。

明明的爸爸首先做了一張5行5列的效益表,如下所示:

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

在這張效益表中,每行代表一名公司職員,每列代表一個客戶,每行中的5個數字就表示了當該行所代表的公司職員和每位客戶談判時所能產生的效益。明明的爸爸就要通過這張效益表來決定哪位職員與哪位顧客談判,然後能夠使公司的效益最大。就拿上面這張表來看,由於無論哪位職員與哪位客戶談判,所產生的效益都是1,因此最大的效益就是5。這是最簡單的一種情況,但是當效益表裏的數字變得複雜,就很難進行選擇,到底哪種組合方式纔是最優的。因此明明的爸爸求助於你,幫助他解決這個問題。
明明的爸爸的問題可以歸結爲:給你一張5行5列的效益表,表中的數字均爲大於等於0的整數,要求在這張表中選出5個數字,使這5個數字的和最大。(注:這5個數字分別來自表中的不同行不同列,即同一行只能選擇一個數字,同一列也只能選擇一個數字。)
輸入說明 :
你寫的程序要求從標準輸入設備中讀入測試數據作爲你所寫程序的輸入數據。標準輸入設備中有多組測試數據。每組測試數據佔5行;每行包含5個正整數;第i行的第j個正整數Aij代表第i名職員與第j位客戶談判能爲公司帶來的經濟效益(0≤Aij≤100, 1≤i,j≤5)。每組測試數據與其後一組測試數據之間沒有任何空行;第一組測試數據前面以及最後一組測試數據後面也都沒有任何空行。
輸出說明 :
對於每一組測試數據,你寫的程序要求計算出一組相應的運算結果,並將每組運算結果作爲你所寫程序的輸出數據依次寫入到標準輸出設備中。每組運算結果爲一個整數s,即這一天中公司的最大可能總經濟效益。例如:當測試數據中的所有Aij(1≤i,j≤5)均爲1時,運算結果s應爲5。輸出時,每組運算結果s單獨佔一行,其行首和行尾都沒有任何空格或其他任何字符;每組運算結果與其後一組運算結果之間沒有任何空行或其他任何字符,第一組運算結果前面以及最後一組運算結果後面也都沒有任何空行或其他任何字符。
注:通常,顯示屏爲標準輸出設備。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//選最大的那個數,依次把行列的數給設置爲0 
int main(){
	int i,j,max=-1,sum=0,k=5;
	int flagi=0,flagj=0; 
	int num[5][5];
	while(scanf("%d",&num[0][0])!=EOF){
		for(i=0;i<5;i++){
			for(j=0;j<5;j++){
				if(i==0&&j==0)
					continue;
				else
				scanf("%d",&num[i][j]);
			}
		}
		k=5;
		while(k>0){
			max=-1;
			for(i=0;i<5;i++){
				for(j=0;j<5;j++){
					if(max<=num[i][j]){
						max=num[i][j];
						flagi=i;
						flagj=j;
					}		
				}
			}
			for(i=0;i<5;i++){
				num[i][flagj]=-11;
			}
			for(i=0;i<5;i++){
				num[flagi][i]=-11;
			}
			sum+=max;
			k--;
			//printf("%d\n",max);
		}
		printf("%d\n",sum);
		k=5;
		sum=0;
	}
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章