招聘市场有几份工作,交由A、B、C、D、F个人来完成,他们完成每份工作的效率各不相同:
求五份工作的总效率最高的分配方式。
那么,肯定又是回溯了。
先试着分配工作,记录下总效率和分配方式,如果找到更高效率的分配方式,则替换,遍历所有方式后,输出最后一次保存的解。简单来说就是这样了。那么我们来看代码:
1 1 #include2 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 else38 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 }
代码有不足的,欢迎指教!