设有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<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 种完整分配方案
#转载请注明出处!