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

概述

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

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

//解空间为子集树
#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个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部