File tree Expand file tree Collapse file tree 1 file changed +10
-4
lines changed Expand file tree Collapse file tree 1 file changed +10
-4
lines changed Original file line number Diff line number Diff line change @@ -58,7 +58,7 @@ https://leetcode-cn.com/problems/find-minimum-time-to-finish-all-jobs/
5858
5959需要注意的是** 能力检测** 部分,我们需要枚举所有的情况,而不是像大多数能力检测二分那样直接一次遍历,这是因为这道题可以** 不连续** 地选择多个 job。这提示我们使用回溯来解决。
6060
61- 初始化一个长度为 k 的 workloads, workloads[ i] 表示第 i 个功能目前的工时 。如果第 i 个工人可以做,就** 贪心地** 进行选择。否则,我们尝试下一个 job。
61+ 初始化一个长度为 k 的 workloads, workloads[ i] 表示第 i 个工人👷目前的工时 。如果第 i 个工人可以做,就** 贪心地** 进行选择。否则,我们尝试下一个 job。
6262
6363除此之外,我们需要对算法进行剪枝,否则无法通过所有的测试用例。
6464
@@ -84,11 +84,13 @@ class Solution:
8484 workloads[i] += jobs[pos]
8585 if backtrack(pos + 1 , workloads, limit): return True
8686 workloads[i] -= jobs[pos]
87+ # 剪枝
8788 if workload == 0 :
8889 return False
8990 return False
9091 def possible (limit ):
9192 return backtrack(0 , [0 ] * k, limit)
93+ # 剪枝
9294 jobs.sort(reverse = True )
9395 l, r = jobs[0 ], sum (jobs)
9496 while l <= r:
@@ -115,16 +117,20 @@ k 二进制位为 1 表示选取任务 k,否则表示不选取任务 k。
115117
116118那么转移方程为:
117119
118- $$
120+ <!-- $$
119121 dp[i][j]=\left\{
120122 \begin{aligned}
121123 min(dp[i][j], max(dp[i-1][j - sub], sum[sub])) & & i > 0 \\
122124 sum[j] & & i == 0 \\
123125 \end{aligned}
124126 \right.
125- $$
127+ $$ -->
126128
127- 这里枚举子集可进行子集枚举优化策略,具体可看我的 91 天学算法的《基础篇 - 枚举》部分的讲义 。
129+ ![ ] ( https://tva1.sinaimg.cn/large/008i3skNly1gs0a7pgkgaj30u204ejrs.jpg )
130+
131+ 其中 sub 是 j 的子集, sum(sub) 指的是任务情况如 sub 二进制表示那样的完成的** 总时间** 。
132+
133+ 因此我们必须枚举所有 j 的子集 sub。这里枚举子集可进行子集枚举优化策略,具体可看我的 91 天学算法的《基础篇 - 枚举》部分的讲义 。
128134
129135提示:
130136
You can’t perform that action at this time.
0 commit comments