Ka的回溯编程练习 Part4|分配工作与选书
设有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 }
同类题目选书
学校放寒假时,信息学竞赛辅导老师有A,B,C,D,E五本书,要分给参加培训的张、王、刘、孙、李五位同学,每人只能选一本书。老师事先让每个人将自己喜欢的书填写在如下的表格中。然后根据他们填写的表来分配书本,希望设计一个程序帮助老师求出所有可能的分配方案,使每个学生都满意。
1 #include <stdio.h> 2 int BookTheyLike[6][6]={{0,0,0,0,0,0},{0,1,0,0,1,0},{0,1,1,0,0,1},{0,0,1,1,0,0},{0,0,0,0,1,0},{0,0,1,0,0,1}}; 3 int Method[6]={0},ThisIsMyBook[6]={0}; 4 int AreTheyAllLikeIt=0; 5 void output() 6 { 7 printf("method:"); 8 int k; 9 for(k=1;k<=5;k++) 10 printf("%d",Method[k]); 11 printf("\n"); 12 } 13 void search(int n) 14 { 15 int i; 16 for(i=1;i<=5;i++) 17 { 18 if(BookTheyLike[n][i]==1)//因为如果不喜欢此本书的话这个解就没有意义了,所以可以先检测一下此书是否喜欢再往下搜索 19 { 20 if(ThisIsMyBook[i]==0) 21 { 22 Method[n]=i; 23 ThisIsMyBook[i]=1; 24 AreTheyAllLikeIt+=BookTheyLike[n][i]; 25 if(AreTheyAllLikeIt==5) output(); 26 else search(n+1); 27 ThisIsMyBook[i]=0; 28 AreTheyAllLikeIt-=BookTheyLike[n][i]; 29 } 30 } 31 } 32 } 33 int main() 34 { 35 search(1); 36 return 0; 37 }
代码和上面的原理差不多,只是多了注释那里,可以省点时间