选择工作 回溯搜索

设有ABCDE五人从事J1J2J3J4J5五项工作,每人只能从事一项,他们的效益如下。

每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。
/*相当于将五种工作排列组合,从中挑选出效率最高的*/

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
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 maxx=0,g[10],f[10];
bool work[6];//每个工作又没有被选
int search(int,int);
int main()
{
search(1,0);
for(int i=1;i<=5;i++)
{
cout<<char(64+i)<<":J"<<g[i]<<" ";//每个工人干什么工作
}
cout<<"supply:"<<maxx<<endl;//输出效率
return 0;
}
int search(int x,int t)
{
for(int i=1;i<=5;i++)
{
if(!work[i])//第i个工作没有被选
{
f[x]=i;//第x个人选第i个工作
work[i]=1;//工作被选
t+=data[x][i];//效率和增加

if(x==5)
{
if(t>maxx)//选出效率最高的那一个
{
maxx=t;
for(int i=1;i<=5;i++)
{
g[i]=f[i];
}
}
}
else
search(x+1,t);
t-=data[x][i];//回溯
work[i]=0;
}
}
}

原文地址:https://www.cnblogs.com/zzyh/p/6609428.html