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 }

代码和上面的原理差不多,只是多了注释那里,可以省点时间

posted on 2015-05-20 18:13  Ricochet!  阅读(514)  评论(0编辑  收藏  举报