设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下。
每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。
#include<stdio.h>
#include<stdlib.h>
int MansToJobs[6][6]={ {0,0,0,0,0,0},
{0,13,11,10,4,7},
{0,13,10,10,8,5},
{0,5,9,7,7,4},
{0,15,12,10,11,5},
{0,10,11,8,8,4} }; //前面代表人名,后面代表工作量
int TheBestResultOfDistribution[6]={0}; //选择时的临时储存
int BossWantIt[6]={0}; //最优解的储存和上面一样都是下标代表工作序号,内容代表工作者
int BestRecord=0,NowadayRecord=0;
//工作总量储存:BestRecord是最优解的储存,NowadayRecord是临时储存
int search(int n){ //第几个人
int i,j;
for(i=1;i<=5;i++){ //第几个工作
if(TheBestResultOfDistribution[i]==0){ //如果此工作没人干
TheBestResultOfDistribution[i]=n; //交给此人
NowadayRecord+=MansToJobs[n][i]; //记录工作总情况
if(n==5){ //如果已经有了5个选择
if(NowadayRecord>BestRecord){ //如果这一次的总工作量大于上一次记录的最多的
BestRecord=NowadayRecord;
for(j=1;j<=5;j++)
BossWantIt[j]=TheBestResultOfDistribution[j];
}
}else
search(n+1);
TheBestResultOfDistribution[i]=0;
NowadayRecord-=MansToJobs[n][i];
}
}
}
int main(){
int i;
search(1);
for(i=1;i<=5;i++)
printf("The job:%d give the guy:%d\n",i,BossWantIt[i]);
printf("total:%d",BestRecord);
system("pause");
return 0;
}