分配问题 --- 蛮力法

分配问题 --- 蛮力法

问题描述

假设有n个任务需要分配给n个人执行,每个任务只分配给一个人,每个人只分配一个任务,且第j个任务分配给第i个人的成本是C[i, j](1≤i , j≤n),任务分配问题要求找出总成本最小的分配方案。

蛮力法

思路:
通过递归遍历所有方案,找到成本最小的那个方案。

//分配问题:蛮力法
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxx 10000
using namespace std;
int n;//任务总数
int x[maxx][maxx];//员工完成某任务需要的成本
int visited[maxx];//标记任务是否被占用
int sum = 0;//完成所有任务需要的成本
int value = maxx;//完成所有任务需要的最小成本
int staff1[maxx];//标记员工的任务
int staff2[maxx];
int recursion(int s)//s表示第s位员工选择任务
{
    if(s > n)//判断是否选择完毕
    {
        if(sum < value)
        {
            value = sum;//获取最小成本
            for(int i=1;i<=n;i++)
            {
                staff2[i] = staff1[i];
            }
        }
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        if(visited[i] != 0)
        {
            continue;
        }
        visited[i] = 1;
        sum +=x[s][i];
        staff1[s] = i;
        recursion(s+1);
        //回溯
        visited[i] = 0;
        sum -= x[s][i];     
    }
    return 0;
}

int main()
{
    cout << "请输入任务数量:";
    cin >> n;
    memset(visited,0,sizeof(visited));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            printf("请输入第 %d 位员工做第 %d 号任务需要的成本大小:",i,j);
            cin >> x[i][j];
        }
    }   
    recursion(1);
    cout << "当成本最小时,员工所对应的任务依次为:";
    for(int i=1;i<=n;i++)
    {
        cout << staff2[i] << " ";
    }
    cout << endl << "最小成本为:" << value << endl;
    return  0;
}

运行结果如下;

猜你喜欢

转载自blog.csdn.net/qq_41879343/article/details/89297211
今日推荐