工作分配~题解(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
- 收藏
- 分享
- 文章举报
相关文章推荐
- 〖編程·C++〗回溯算法:排列树 - 工作分配问题
- 解析C++汇编代码(了解函数在堆栈中的工作流程)-局部变量空间分配及程序栈操作
- 明晰C++内存分配的五种方法的区别
- 【poj 2531】Network Saboteur 题意&题解&代码(C++)
- LeetCode题解(C++版)
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- 明晰C++内存分配的五种方法的区别
- 2016级计算机C++助教工作(9)第三次上课内容
- 2012-02-24(补) 工作分配,工作分解粒度也需要灵活控制
- C/C++程序中致命的内存分配问题
- C/C++如何让类对象只在栈(堆)上分配空间?
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- C++动态分配指针数组
- LeetCode#647 Palindromic Substrings题解(C++版)
- c++ 内存分配
- C与C++中内存分配释放-malloc,free,new,delete
- 素数判定c++题解
- 不找C++的工作也要学C++
- C++内存动态分配
- C/C++:程序的内存分配方式