题解-工作分配

工作分配

描述

2020 年,小信自己开了一家拥有 N 个员工的大公司。每天,小信都要分配 N 项工作给他的员工,但是,由于能力的不同,每个人对处理相同工作所需要的时间有快有慢。众所周知,小信是一个非常重视效率的人,他想知道该如何分配工作,才能使得完成所有工作的时间总和最小(每个员工只可以被分配到一个工作)。但是我们也都知道小信不是一般的懒,所以小信找到了你,请你拯救一下小信吧!

输入

第一行输入一个整数 N,代表有 N 个员工,员工编号从 1 到 N。(1 ≤ N ≤ 10)

接着输入一个 N * N 的二维矩阵 task[N][N],task[i][j] 指的是第 i 项工作如果由 j 号员工完成所需要的时间。(0 ≤ task[i][j] ≤ 1000)

输出

输出结果包括一个整数,代表所需要的最少时间(求和)。

输入样例 1

6
10 11 12 11 9 11
11 9 10 13 11 12
12 10 11 10 13 9
9 14 9 10 10 11
10 10 9 11 12 11
10 7 10 10 10 8

输出样例 1

54

提示

样例,第 1 个任务由 5 号员工完成,第 2 个任务由 2 号员工完成,第 3 个任务由 4 号员工完成,第 4 个任务由 1 号员工完成,第 5 个任务由 3 号员工完成,第 6 个任务由 6 号员工完成,花费总时间 9 + 9 + 10 + 9 + 9 + 8 = 54。

人的位置不变,搜索工作的排列方案,记录时间之和,与ans打擂.
代码:

#include<bits/stdc++.h>
using namespace std;
int n,pepol=0;
int x[1000],c[1000][1000];
void dfs(int i,int thing){
    if(i>n&&thing<pepol){
        pepol=thing;
        return ;
    }
    if(thing<pepol)
        for(int j=1;j<=n;j++)
            if(x[j]==0){
                x[j]=1;
                dfs(i+1,thing+c[i][j]);
                x[j]=0;
            }
}
int main (){
    cin>>n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
                cin>>c[i][j];
            x[i]=0;
            pepol+=c[i][i];
        }
        dfs(1,0);
        cout<<pepol;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值