|
| 1 | +# [1986. 完成任务的最少工作时间段](https://leetcode.cn/problems/minimum-number-of-work-sessions-to-finish-the-tasks/) |
| 2 | + |
| 3 | +- 标签:位运算、数组、动态规划、回溯、状态压缩 |
| 4 | +- 难度:中等 |
| 5 | + |
| 6 | +## 题目大意 |
| 7 | + |
| 8 | +**描述**:给定一个整数数组 $tasks$ 代表需要完成的任务。 其中 $tasks[i]$ 表示第 $i$ 个任务需要花费的时长(单位为小时)。再给定一个整数 $sessionTime$,代表在一个工作时段中,最多可以连续工作的小时数。在连续工作至多 $sessionTime$ 小时后,需要进行休息。 |
| 9 | + |
| 10 | +现在需要按照如下条件完成给定任务: |
| 11 | + |
| 12 | +1. 如果你在某一个时间段开始一个任务,你需要在同一个时间段完成它。 |
| 13 | +2. 完成一个任务后,你可以立马开始一个新的任务。 |
| 14 | +3. 你可以按任意顺序完成任务。 |
| 15 | + |
| 16 | +**要求**:按照上述要求,返回完成所有任务所需要的最少数目的工作时间段。 |
| 17 | + |
| 18 | +**说明**: |
| 19 | + |
| 20 | +- $n == tasks.length$。 |
| 21 | +- $1 \le n \le 14$。 |
| 22 | +- $1 \le tasks[i] \le 10$。 |
| 23 | +- $max(tasks[i]) \le sessionTime \le 15$。 |
| 24 | + |
| 25 | +**示例**: |
| 26 | + |
| 27 | +- 示例 1: |
| 28 | + |
| 29 | +```Python |
| 30 | +输入:tasks = [1,2,3], sessionTime = 3 |
| 31 | +输出:2 |
| 32 | +解释:你可以在两个工作时间段内完成所有任务。 |
| 33 | +- 第一个工作时间段:完成第一和第二个任务,花费 1 + 2 = 3 小时。 |
| 34 | +- 第二个工作时间段:完成第三个任务,花费 3 小时。 |
| 35 | +``` |
| 36 | + |
| 37 | +- 示例 2: |
| 38 | + |
| 39 | +```Python |
| 40 | +输入:tasks = [3,1,3,1,1], sessionTime = 8 |
| 41 | +输出:2 |
| 42 | +解释:你可以在两个工作时间段内完成所有任务。 |
| 43 | +- 第一个工作时间段:完成除了最后一个任务以外的所有任务,花费 3 + 1 + 3 + 1 = 8 小时。 |
| 44 | +- 第二个工作时间段,完成最后一个任务,花费 1 小时。 |
| 45 | +``` |
| 46 | + |
| 47 | +## 解题思路 |
| 48 | + |
| 49 | +### 思路 1:状压 DP |
| 50 | + |
| 51 | +### 思路 1:代码 |
| 52 | + |
| 53 | +```Python |
| 54 | +class Solution: |
| 55 | + def minSessions(self, tasks: List[int], sessionTime: int) -> int: |
| 56 | + size = len(tasks) |
| 57 | + states = 1 << size |
| 58 | + |
| 59 | + prefix_sum = [0 for _ in range(states)] |
| 60 | + for state in range(states): |
| 61 | + for i in range(size): |
| 62 | + if (state >> i) & 1: |
| 63 | + prefix_sum[state] = prefix_sum[state ^ (1 << i)] + tasks[i] |
| 64 | + break |
| 65 | + |
| 66 | + dp = [float('inf') for _ in range(states)] |
| 67 | + dp[0] = 0 |
| 68 | + for state in range(states): |
| 69 | + sub = state |
| 70 | + while sub > 0: |
| 71 | + if prefix_sum[sub] <= sessionTime: |
| 72 | + dp[state] = min(dp[state], dp[state ^ sub] + 1) |
| 73 | + sub = (sub - 1) & state |
| 74 | + |
| 75 | + return dp[states - 1] |
| 76 | +``` |
| 77 | + |
| 78 | +### 思路 1:复杂度分析 |
| 79 | + |
| 80 | +- **时间复杂度**: |
| 81 | +- **空间复杂度**: |
| 82 | + |
0 commit comments