C++回溯法实例2
设有A、B、C、D、E五人从事J1、J2、J3、J4、J5五项工作,每人只能从事一项,他们的效益如图所示,求最佳安排使效益最高。J1 J2 J3 J4 J5
A 13 11 10 4 7
B 13 10 10 8 5
C 5 9 7 7 4
D 15 12 10 11 5
E 10 11 8 8 4
#include <iostream.h>
int a[5],b[5],cheap,xiaoyi;
int e[5][5]={{13,11,10,4,7},{13,10,10,8,5},{5,9,7,7,4},{15,12, 10,11,5},{10,11,8,8,4}};
void gongzuo(int i,int j);
void jianzhi()
{
if(xiaoyi<cheap)
{
xiaoyi=cheap;
for(int l=0;l<5;l++)
b[l]=a[l];
}
for(int i=4;i>-1;i--)//回溯
if(a
{
cheap-=e
gongzuo(i,a
}
else cheap-=e
}
void gongzuo(int i,int j)
{
int flage=0;
if(i>0)
{//不能同列
for(int k=0;k<i;k++)
if(a[k]==j) flage=1;
}
if(flage==0)
{
cheap+=e
a
if(i<4)
{
gongzuo(i+1,0);
cheap-=e
}
else jianzhi();
}
else
{
if(j<4) gongzuo(i,j+1);
else if(i>0)
{//寻找可以符合条件的节点
for(int l=i-1;l>-1;l--)
if(a[l]<4)
{
cheap-=e[l][a[l]];
gongzuo(l,a[l]+1);
}
else cheap-=e[l][a[l]];
}
}
}
void main()
{
xiaoyi=0;
cout<<"最高效益安排为:";
gongzuo(0,0);
cout<<xiaoyi<<endl;
for(int i=0;i<5;i++)
cout<<"第"<<char(i+65)<<"个人做第"<<b
}