设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下:
每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。
算法分析:
(1)用数组f储存工作选择的方案;数组g存放最优的工作选择方案;数组p用于表示某项工作有没有被选择了。
(2)
- 选择p(i)=0的第i项工作;
- 判断效益是否高于max已记录的效益,若高于则更新g数组及max的值。
(3)搜索策略: 回溯法(深度优先搜索dfs)。
参考代码:
#include<cstdio>
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 max1=0,g[10],f[10];
bool p[6]={0};
int go(int step,int t){ // step是第几个人,t是之前已得的效益
for (int i=1;i<=5;i++)
if (!p[i]){ //判断第i项工作没人选择
f[step]=i; //第step个人,就选第i项工作
p[i]=1; //标记第i项工作被人安排了
t+=data[step][i]; //计算效益值
if (step<5) go(step+1,t);
else if (t>max1) { //保存最佳效益值
max1=t;
for (int j=1;j<=5;j++)
g[j]=f[j]; //保存最优效益下的工作选择方案
}
t-=data[step][i]; //回溯
p[i]=0;
}
}
int main(){
go(1,0); //从第1个人,总效益为0开始
for (int i=1;i<=5;i++)
printf("%c: J%3d",64+i,g[i]) ;
printf("\nsupply: %d\n",max1); //输出最佳效益值
}