我是靠谱客的博主 复杂大神,这篇文章主要介绍任务分配——回溯法有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。,现在分享给大家,希望可以做个参考。

有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。

思路:解空间为子集树,用回溯法(dfs)搜索所有方案取最优解

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//解空间为子集树 #include<iostream> #include<cstring> using namespace std; #define INF 0x3f3f3f3f #define MAXN 21 int n=4;//任务数量 //第i个人执行第j个任务的成本 int c[MAXN][MAXN]={{0},{0,9,2,7,8},{0,6,4,3,7},{0,5,8,1,8},{0,7,6,9,4}}; int x[MAXN];//临时解 int cost=0;//临时解的成本 int bestx[MAXN];//最优解 int mincost=INF;//最优解的成本 bool worker[MAXN];//worker[j]表示任务j是否已分配人员 void dfs(int i){ if(i>n){ if(cost<mincost){ mincost=cost; for(int k=1;k<=n;k++){ bestx[k]=x[k]; } } } else{ for(int j=1;j<=n;j++){ //为人员i试探任务j,从1到n if(!worker[j]){ //任务j还未分配 worker[j]=true; cost+=c[i][j]; x[i]=j; dfs(i+1); //回溯 worker[j]=false; cost-=c[i][j]; x[i]=0; } } } } int main() { memset(worker,false,sizeof(worker));//任务还未分配 dfs(1); cout<<"最优方案:"<<endl; for(int k=1;k<=n;k++){ cout<<"第"<<k<<"个人安排任务"<<bestx[k]<<endl; } cout<<"总成本为:"<<mincost<<endl; }

最后

以上就是复杂大神最近收集整理的关于任务分配——回溯法有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。的全部内容,更多相关任务分配——回溯法有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部