您的位置:首页 > 编程语言 > C语言/C++

工作分配~题解(c++)——【S神】苏嘉亿

2020-04-22 08:40 986 查看

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

Input
第一行输入一个整数 N,代表有 N 个员工,员工编号从 1 到 N。(1 ≤ N ≤ 10)接着输入一个 N * N 的二维矩阵 task

,task[i][j] 指的是第 i 项工作如果由 j 号员工完成所需要的时间。(0 ≤ task[i][j] ≤ 1000)

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

Sample Input 1

3
4 2 5
2 3 6
3 4 5

Sample Output 1

9

Sample Input 2

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

Sample Output 2

54

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

代码

#include<bits/stdc++.h>
using namespace std;

int vis[15];
int a[15][15];
int b[15];//b[i] 第i个人分到的工作
int n,ans=1e9;

void dfs(int t){
if(t>n){
int sum=0;
for(int i=1;i<=n;i++){
sum+=a[i][b[i]];
}
ans=min(ans,sum);//打擂
return;
}//方案检查
for(int i=1;i<=n;i++){
if(!vis[i]){
b[t]=i;//把第i工作分给第t人
vis[i]=1;//打标记
dfs(t+1);//回溯,给下一个人分工作
vis[i]=0;//清空
}
}
}

int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
dfs(1);//一进来给第一人分工作
printf("%d",ans);
return 0;
}
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
Walter~Harwalk 发布了5 篇原创文章 · 获赞 5 · 访问量 450 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: