1723. 完成所有工作的最短时间

题目

给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间。

请你将这些工作分配给 k 位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化

返回分配方案中尽可能 最小最大工作时间

示例 1:

输入:jobs = [3,2,3], k = 3
输出:3
解释:给每位工人分配一项工作,最大工作时间是 3 。

示例 2:

输入:jobs = [1,2,4,7,8], k = 2
输出:11
解释:按下述方式分配工作:
1 号工人:1、2、8(工作时间 = 1 + 2 + 8 = 11)
2 号工人:4、7(工作时间 = 4 + 7 = 11)
最大工作时间是 11 。

提示:

  • 1 <= k <= jobs.length <= 12
  • 1 <= jobs[i] <= 107

思路

一开始其实是想的分支限界法,但实在代码能力不强,而且一个人可能有多个工作,也可能没有,所以真的搞出来还是很难,更别说我还不会写分支限界的代码= =。也不知道有没有大佬有分支限界的思路解决这个问题。

总之姑且是搞出了基本的DFS回溯,果然超时了= =:

class Solution {int[] num;// 工人工作的数组int res = Integer.MAX_VALUE;public int minimumTimeRequired(int[] jobs, int k) {num = new int[k];dfs(jobs, 0, k);return res;}public void dfs(int[] jobs, int job, int k) {// 工作分配完了,把最小的最大工作时间记录下来:if (job >= jobs.length) {// 找到数组中最大值int max = 0;for (int i : num) {max = Math.max(max, i);}// 记录最小的最大工作时间res = Math.min(max, res);return;}// 给人分配工作,然后dfs+回溯for (int i = 0; i < k; i++) {num[i] += jobs[job];dfs(jobs, job + 1, k);// job+1:分配下一个工作num[i] -= jobs[job];}}
}

之后怎么剪枝就不知道了,这个回溯的过程递归树我都不能完全理解清楚,只是单纯的套了下回溯的模板就不知道为什么能过几个测试用例= =。

然后也是看了一下宫水三叶大佬的题解(官方题解看的我有点自闭= =),发现了两点:

1,可以把max当成递归参数传递,就不用每次找了;

2,max >= res直接return,比起每次res = Math.min(max, res);要稍微快一些;

然后就是最重要的剪枝了:

1,如果后面的工人还没被安排工作,那那些没被安排工作的都是一样的,不需要一个个枚举,直接把工作安排给任何一个人就行了;

2,如果有人空闲,比起将工作安排给已经有工作的人,肯定是将工作安排给没工作的人时间更短,那就没必要再枚举那些有工作的人了;

结合上面的两点,最终就有了下面的代码

官方题解还有dp状态压缩什么的,理解不能,饶了我吧= =。

二分的倒是能理解,dfs基础上套就好了,不过还是有点麻烦,代码量比较大,理解起来也是有点难度的,自己写出来就更难了,所以姑且就到这吧。

代码

class Solution {int res = Integer.MAX_VALUE;int[] jobs;int k;public int minimumTimeRequired(int[] jobs, int k) {this.jobs = jobs;this.k = k;dfs(0, 0, new int[k], 0);return res;}/*** @param max 当前工作时长数组中的最大值* @param j   现在要处理的工作* @param num 各个工人的工作时长数组(这个放全局和放递归里面应该都可以,怕错所以就放递归参数里了)* @param man 已经被分配工作的人数*/public void dfs(int max, int j, int[] num, int man) {if (max >= res) return;if (j >= jobs.length) {res = max;return;}// 已经被分配工作的人数小于k的话,就不用再一一对后面的空闲工人或前面已工作的工人枚举了;if (man < k) {// 有空闲的人直接将工作分配给空闲的;num[man] += jobs[j];dfs(Math.max(num[man], max), j + 1, num, man + 1);// 分配工作的人+1num[man] = 0;}// 后续照常枚举,注意是要小于man,// 跟小于k差不多,只是对于前面有空闲的人进行了剪枝,所以必须保证递归树是相同的;for (int i = 0; i < man; i++) {num[i] += jobs[j];dfs(Math.max(num[i], max), j + 1, num, man);num[i] -= jobs[j];}}
}

LeetCode每日一题: 1723. 完成所有工作的最短时间相关推荐

  1. 【LeetCode/力扣】1723. 完成所有工作的最短时间

    1 题目描述 题目链接:https://leetcode-cn.com/problems/find-minimum-time-to-finish-all-jobs/ 给你一个整数数组 jobs ,其中 ...

  2. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  3. [leetcode每日一题2021/5/8]1723. 完成所有工作的最短时间

    1723. 完成所有工作的最短时间 题目 思路 动态规划 状态转移方程 优化 求和打表 快速枚举每种选取情况jjj的子集ppp 代码 算法复杂度 题目来源于leetcode,解法和思路仅代表个人观点. ...

  4. leetcode 1723.完成所有工作的最短时间 - 二分+递归

    leetcode 1723.完成所有工作的最短时间 - 二分+递归 题干 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有 ...

  5. LeetCode 1723 完成所有工作的最短时间 题解

    LeetCode 1723 完成所有工作的最短时间 题解 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工作都应该分配给 ...

  6. (leetcode)1723. 完成所有工作的最短时间 -2021/5/8

    文章目录 1723. 完成所有工作的最短时间 javascript 1723. 完成所有工作的最短时间 javascript 题目: 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i ...

  7. 1723. 完成所有工作的最短时间

    原题链接:1723. 完成所有工作的最短时间 solution:         dfs + 回溯 + 剪枝 ①结束条件:任务分配完成,maxt保存所有工人的最大工作时长,再用maxt和以前的最大工作 ...

  8. Leetcode-二分+递归/回溯-1723. 完成所有工作的最短时间

    题目1723. 完成所有工作的最短时间: 题解: 递归回溯模板超时 按照模板+简单剪枝,超时 class Solution { private:vector<int> sum;int mi ...

  9. LeetCode每日一题——1235. 规划兼职工作

    LeetCode每日一题系列 题目:1235. 规划兼职工作 难度:困难 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你打算利用空闲时间来做兼职工作赚些零花钱. 这里有 n ...

最新文章

  1. 常量指针与指向常量的指针
  2. 数据结构 如何删除单向链表的倒数第m个元素
  3. insightface scrfd人脸检测测试
  4. 面向对象——单例设计模式
  5. Report not added to business roles
  6. 笔记本电脑关机后指示灯还亮_汽车仪表常见指示符号之清洗液指示灯,灯亮了怎么办?...
  7. 媲美专业相机? 看看华为P40带来的影像新突破!
  8. java .jar怎么打开_详解jar文件怎么打开
  9. 《炬丰科技-半导体工艺》--技术资料合集14
  10. 奥克兰大学 计算机硕士 GPA,奥克兰大学GPA
  11. 软件工程阶段性总结(二)——软件计划和需求分析
  12. 华为认证Datacom和Routing Switching方向的优势
  13. 树梅派应用22:树莓派 SAKS 扩展板实用应用 之 DS1307 RTC 时钟模块
  14. matplotlib 绘制柱状图且上方显示数据
  15. 禀赋效应还是锚定效应
  16. “羊了个羊”是如何吸引住你的
  17. 临近新春佳节,如何多快好省地买遍全球年货?
  18. 【Kafka】第三篇-Kafka的集群及Canal介绍
  19. 2021阳城一中高考成绩查询,2017阳城一中录取分数线(附2017高考成绩喜报)
  20. platform平台驱动模型简述(linux驱动开发篇)

热门文章

  1. 练手项目2笔记之day01
  2. 微信H5页面分享案例模版
  3. 复旦提出M2TR:首个多模态多尺度Transformer
  4. C++ Qt 05:Qt布局管理器 - 荒 木 - 博客园
  5. App-UI自动化测试(Airtest+Pycharm)
  6. 当析构函数遇到多线程 ── C++ 中线程安全的对象回调
  7. 深度学习之学习(1-2)感受野(receptive field)
  8. LightGBM 中文文档
  9. echart地图飞线图
  10. 南传法句经(摘选)03