Skip to content

Commit 6fe311f

Browse files
committed
Create 1986. 完成任务的最少工作时间段.md
1 parent 3a9f3fc commit 6fe311f

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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

Comments
 (0)