关于回溯与招聘市场
招聘市场有几份工作,交由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 }
代码有不足的,欢迎指教!
浙公网安备 33010602011771号