设有A,B,C,D,E无人,从事J1,J2,J3,J4,J5五项工作,每人只能从事一项工作,效益图如下。


J1J2J3J4J5
A13111047
B13101085
C59774
D151210115
E1011884

样例代码:

#include<bits/stdc++.h>
using namespace std;
int a[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}};
int flag[5] = {0};
int current[5] = {0};
int maximum[5] = {0};
int c_t=0;
int m_t=0; 
void search(int t) //t: 第几次选择
{
    for(int i=0;i<=4;i++){
        if(flag[i]!=1){
            //选中并保存目标(标记该目标为已经查看并且保存至答案数组)
			flag[i]=1;current[t]=i;c_t+=a[t][i]; 
            if(t==4){
            	if(m_t<c_t) {
					m_t=c_t;
            		for(int asd=0;asd<=4;asd++) maximum[asd]=current[asd];
            	}
            }else{
                search(t+1); //search自增调用 
            } flag[i]=0;current[t]=0;c_t-=a[t][i]; //回退状态和结果(和选中并保存结果正好相反)
        }
	}
}
int main(){
	search(0);
	cout<<"最大收益:"<<m_t<<endl;
	cout<<"安排方案:";
	for(int i=0;i<=4;i++){
		cout<<maximum[i]<<", ";
	} cout<<"<end_of_output>"; 
	return 0;
}

代码思路:

# 代码功能概述
## 这段代码实现了一个任务分配问题的暴力搜索(深度优先搜索,DFS),目标是:
## 有 5 个任务(索引 0 到 4)
## 有 5 个执行者(索引 0 到 4)
## a[t][i] 表示 第 t 个任务 分配给 第 i 个执行者 的收益
## 每个执行者只能分配一个任务
## 找到总收益最大的分配方案
> 第 0 层:为任务 0 选择执行者(5 种可能)
> 第 1 层:为任务 1 选择未被占用的执行者(4 种可能)
> ...
> 第 4 层:为任务 4 选择最后一个剩余执行者
> 总搜索空间:5! = 120 种完整分配方案


#转载请注明出处!