从事效应
【题目】
设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下。
![](https://images2015.cnblogs.com/blog/1119446/201704/1119446-20170422101104009-725419353.png)
每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。
【算法分析】
⒈用数组f储存工作选择的方案;数组g存放最优的工作选择方案;数组p用于表示某项工作有没有被选择了。
⒉(1)选择p(i)=0的第i项工作;
(2)判断效益是否高于max已记录的效益,若高于则更新g数组及max的值。
⒊搜索策略: 回溯法(深度优先搜索dfs)。
【代码】
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> using namespace std; int data[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} }; int f[52]; //数组f储存工作选择的方案 int g[52]; //数组g存放最优的工作选择方案 bool p[6]= {0}; //数组p用于表示某项工作有没有被选择 int maxx=0; int search(int,int); int main() { search(1,0); for (int i=1; i<=5; i++) cout<<char(64+i)<<":J"<<g[i]<<" "; //输出各项工作安排情况 cout<<endl; cout<<"max="<<maxx<<endl; return 0; } int search(int r,int t) { //r为第几个人 for (int i=1; i<=5; i++) if (!p[i]) { //判断第i项工作没人选择 f[r]=i; //第r个人,就选第i项工作 p[i]=1; //标记第i项工作被人安排了 t+=data[r][i]; //计算效益值 if (r<5) search(r+1,t); else if (t>maxx) { //保存最佳效益值 maxx=t; for (int j=1; j<=5; j++) g[j]=f[j]; //保存最优效益下的工作选择方案 } t-=data[r][i]; //回溯 p[i]=0; } }