任务分配——回溯法

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

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

//解空间为子集树
#include
#include
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

 

你可能感兴趣的:(算法设计与分析课)