My Carelessness

Back to your page!


Or leave your comments here.

RegendLa

导航

关于回溯与招聘市场

  招聘市场有几份工作,交由A、B、C、D、F个人来完成,他们完成每份工作的效率各不相同:

  求五份工作的总效率最高的分配方式。

  那么,肯定又是回溯了。

  先试着分配工作,记录下总效率和分配方式,如果找到更高效率的分配方式,则替换,遍历所有方式后,输出最后一次保存的解。简单来说就是这样了。那么我们来看代码:

 1  1 #include<stdio.h>
 2  2 int sum=0,t=0;//sum为最终解的效率,t为临时解的效率
 3  3 int prod[5][5]={{13,11,10,4,7}/*FirstMan*/,
 4  4     {13,10,10,8,5}/*SecondMan*/,
 5  5     {5,9,7,7,4}/*ThirdMan*/,
 6  6     {15,12,10,11,5}/*ForthMan*/,
 7  7     {10,11,8,8,4}/*FifthMan*/};//储存各人的工作效率
 8  8 int temp[5]={0};//临时的分配方式
 9  9 int ans[5]={0};//最终解
10 10 int job[5]={0};//标记该工作是否已被分配出去
11 11 void cygp();//此函数用于临时解与最终解的替换
12 12 void f(int k);
13 13 int main()
14 14 {
15 15     int i;
16 16     f(0);
17 17     for(i=0;i<=4;i++)
18 18         printf("%d:%d ",i+1,ans[i]+1);
19 19     printf("%d\n",sum);
20 20     return 0;
21 21 } 
22 22 void f(int k)
23 23 {
24 24     int i;
25 25     for(i=0;i<=4;i++)
26 26     {
27 27         if(job[i]==0)
28 28         {
29 29             t+=prod[k][i];
30 30             temp[k]=i;
31 31             job[i]=1;
32 32             if( (k==4) && (t>sum) )//若临时分配方式效率更高
33 33             {
34 34                 sum=t;
35 35                 cygp();//将临时分配方式转成正式解
36 36             }
37 37             else
38 38                 f(k+1);
39 39             job[i]=0;
40 40             t-=prod[k][i];
41 41         }
42 42     }
43 43 }
44 44 void cygp()
45 45 {
46 46     int i;
47 47     for(i=0;i<=4;i++)
48 48         ans[i]=temp[i];
49 49 }
View Code

  代码有不足的,欢迎指教!

posted on 2015-05-23 18:08  最爱七  阅读(218)  评论(0)    收藏  举报




Thanks for your coming!
If what you read helps,I would appreciate!