LeetCode 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] <= 10^7

参考

class Solution {//https://leetcode-cn.com/problems/find-minimum-time-to-finish-all-jobs/solution/gong-shui-san-xie-yi-ti-shuang-jie-jian-4epdd/int[] jobs;int n, k;int ans = 0x3f3f3f3f;public int minimumTimeRequired(int[] _jobs, int _k) {jobs = _jobs;n = jobs.length;k = _k;int[] sum = new int[k];dfs(0, 0, sum, 0);return ans;}/*** u     : 当前处理到那个 job* used  : 当前分配给了多少个工人了* sum   : 工人的分配情况          例如:sum[0] = x 代表 0 号工人工作量为 x* max   : 当前的「最大工作时间」*/void dfs(int u, int used, int[] sum, int max) {if (max >= ans) return;//一旦发现某次遍历时最大时间超过了ans就不用往下走了,直接剪枝if (u == n) {ans = max;return;}// 优先分配给「空闲工人」,这样的话,第一轮下来,走到第n个job的时候,max等于先让每个人都有工作,然后剩下的都扔给第一个工人所需要的工作时间if (used < k) {sum[used] = jobs[u];//要保证这里的sum[used]为0,也就是不能在底下的for里对这一位赋值,也就是i必须小于used而不是kdfs(u + 1, used + 1, sum, Math.max(sum[used], max));sum[used] = 0;}//for循环的条件里不能是i<kfor (int i = 0; i < used; i++) {//前期一直深入,used=k,平均分配,每个人都有工作;后期回退的时候,used<k,由于前面有一句sum[used] = 0,所以是有k-used个工人是空闲的,也就是不平均分配sum[i] += jobs[u];dfs(u + 1, used, sum, Math.max(sum[i], max));sum[i] -= jobs[u];}}
}

LeetCode 1723 完成所有工作的最短时间 题解相关推荐

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

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

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

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

  3. leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯)

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

  4. LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...

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

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

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

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

  7. LeetCode每日一题: 1723. 完成所有工作的最短时间

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

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

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

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

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

最新文章

  1. 互联网大脑的发育与元宇宙的兴起
  2. JS放在博客里面运行
  3. Java 服务端推送消息有那么难吗?
  4. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...
  5. transform插件
  6. VS2017 + cmake 3.7 + opencv 3.2 编译
  7. jquery常用功能
  8. MATLAB学习笔记(十四)
  9. React_loadable
  10. mysql cluster安装报错
  11. linux能安装cad快速看图不,ubuntu下能过wine安装cad快速看图
  12. Hilo - 阿里巴巴出品的免费开源 H5 游戏引擎,轻巧无依赖,适合用来开发营销互动小游戏
  13. 【计算机网络】透明网桥:逆向学习算法逐步建立转发表(例题详细解析)
  14. 极限思想之阿基里斯和乌龟赛跑
  15. 论结果与过程的重要性
  16. VCS建立仿真生成DVE波形
  17. 微信小程序通过微信群发消息(订阅消息)
  18. C. Petya and Inequiations
  19. 2.4G wifi 的频道/信道 20M 40M的概念
  20. 基于mysql的应用程序设计[j] 兰旭辉_熊家军_邓刚_高校C语言自动考试系统参考文献...

热门文章

  1. xml 硕正报表_主要指标及功能清单
  2. mysql errno 1146_Mysql学习MySQL复制出错 Last_SQL_Errno:1146的解决方法
  3. 什么是RSS?RSS是什么
  4. 转行学java被辞退_不是所有行业都是“跳槽穷半年,转行穷三年”,至少转行学Java不是!...
  5. iOS16.0:屏幕旋转
  6. utf8字符集中漢字默認占三個字節
  7. 京东云服务器——免费体验6个月
  8. ineligible devices xcode6.3
  9. 谷歌面试题之扔鸡蛋的问题(蓝桥杯摔手机的问题)
  10. buildroot_buildroot-我对多平台发行版创作的经验