标签:
设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下。
每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。
这个主要是细节了,没什么难度
1 #include<stdio.h> 2 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}}; 3 //以上,前一维代表人名,后一维代表工作量 4 int TheBestResultOfDistribution[6]={0}; //选择时的临时储存 5 int BossWantIt[6]={0}; //最优解的储存 和上面都是下标代表工作序号,内容代表工作者 6 int BestRecord=0,NowadayRecord=0; //工作总量储存:BestRecord是最优解的储存,NowadayRecord是临时储存 7 int search(int n) //第几个人 8 { 9 int i,j; 10 for(i=1;i<=5;i++) //第几个工作 11 { 12 if(TheBestResultOfDistribution[i]==0) //如果此工作没人干 13 { 14 TheBestResultOfDistribution[i]=n; //交给此人 15 NowadayRecord+=MansToJobs[n][i]; //记录工作总情况 16 if(n==5) //如果已经有了5个选择 17 { 18 if(NowadayRecord>BestRecord) //又如果这一次的总工作量大于上一次记录的最多的 19 { 20 BestRecord=NowadayRecord; //替代一下 21 for(j=1;j<=5;j++) 22 BossWantIt[j]=TheBestResultOfDistribution[j]; 23 } 24 } 25 else search(n+1); 26 TheBestResultOfDistribution[i]=0; //恢复现场,这一步别的框架可能不需要,但这个需要 27 NowadayRecord-=MansToJobs[n][i]; 28 } 29 } 30 31 } 32 int main() 33 { 34 int i; 35 search(1); 36 for(i=1;i<=5;i++) //输出没什么好说的了 37 printf("The job:%d give the guy:%d\n",i,BossWantIt[i]); 38 printf("total:%d",BestRecord); 39 return 0; 40 }
标签:
原文地址:http://www.cnblogs.com/KakagouLT/p/4517838.html