Skip to content

Commit c39b830

Browse files
authored
feat: add solutions to lc problem: No.1986 (doocs#1351)
No.1986.Minimum Number of Work Sessions to Finish the Tasks
1 parent 2069181 commit c39b830

File tree

7 files changed

+412
-2
lines changed

7 files changed

+412
-2
lines changed

solution/1900-1999/1986.Minimum Number of Work Sessions to Finish the Tasks/README.md

+150-1
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,171 @@
6262

6363
<!-- 这里可写通用的实现逻辑 -->
6464

65+
**方法一:状态压缩动态规划 + 枚举子集**
66+
67+
我们注意到 $n$ 不超过 $14$,因此,我们可以考虑使用状态压缩动态规划的方法求解本题。
68+
69+
我们用一个长度为 $n$ 的二进制数 $i$ 来表示当前的任务状态,其中 $i$ 的第 $j$ 位为 $1$,当且仅当第 $j$ 个任务被完成。我们用 $f[i]$ 表示完成状态为 $i$ 的所有任务所需要的最少工作时间段数。
70+
71+
我们可以枚举 $i$ 的所有子集 $j$,其中 $j$ 的二进制表示中的每一位都是 $i$ 的二进制表示中对应位的子集,即 $j \subseteq i$。如果 $j$ 对应的任务可以在一个工作时间段内完成,那么我们可以用 $f[i \oplus j] + 1$ 来更新 $f[i]$,其中 $i \oplus j$ 表示 $i$ 和 $j$ 的按位异或。
72+
73+
最终的答案即为 $f[2^n - 1]$。
74+
75+
时间复杂度 $O(n \times 3^n)$,空间复杂度 $O(2^n)$。其中 $n$ 为任务的数量。
76+
6577
<!-- tabs:start -->
6678

6779
### **Python3**
6880

6981
<!-- 这里可写当前语言的特殊实现逻辑 -->
7082

7183
```python
72-
84+
class Solution:
85+
def minSessions(self, tasks: List[int], sessionTime: int) -> int:
86+
n = len(tasks)
87+
ok = [False] * (1 << n)
88+
for i in range(1, 1 << n):
89+
t = sum(tasks[j] for j in range(n) if i >> j & 1)
90+
ok[i] = t <= sessionTime
91+
f = [inf] * (1 << n)
92+
f[0] = 0
93+
for i in range(1, 1 << n):
94+
j = i
95+
while j:
96+
if ok[j]:
97+
f[i] = min(f[i], f[i ^ j] + 1)
98+
j = (j - 1) & i
99+
return f[-1]
73100
```
74101

75102
### **Java**
76103

77104
<!-- 这里可写当前语言的特殊实现逻辑 -->
78105

79106
```java
107+
class Solution {
108+
public int minSessions(int[] tasks, int sessionTime) {
109+
int n = tasks.length;
110+
boolean[] ok = new boolean[1 << n];
111+
for (int i = 1; i < 1 << n; ++i) {
112+
int t = 0;
113+
for (int j = 0; j < n; ++j) {
114+
if ((i >> j & 1) == 1) {
115+
t += tasks[j];
116+
}
117+
}
118+
ok[i] = t <= sessionTime;
119+
}
120+
int[] f = new int[1 << n];
121+
Arrays.fill(f, 1 << 30);
122+
f[0] = 0;
123+
for (int i = 1; i < 1 << n; ++i) {
124+
for (int j = i; j > 0; j = (j - 1) & i) {
125+
if (ok[j]) {
126+
f[i] = Math.min(f[i], f[i ^ j] + 1);
127+
}
128+
}
129+
}
130+
return f[(1 << n) - 1];
131+
}
132+
}
133+
```
134+
135+
### **C++**
136+
137+
```cpp
138+
class Solution {
139+
public:
140+
int minSessions(vector<int>& tasks, int sessionTime) {
141+
int n = tasks.size();
142+
bool ok[1 << n];
143+
memset(ok, false, sizeof(ok));
144+
for (int i = 1; i < 1 << n; ++i) {
145+
int t = 0;
146+
for (int j = 0; j < n; ++j) {
147+
if (i >> j & 1) {
148+
t += tasks[j];
149+
}
150+
}
151+
ok[i] = t <= sessionTime;
152+
}
153+
int f[1 << n];
154+
memset(f, 0x3f, sizeof(f));
155+
f[0] = 0;
156+
for (int i = 1; i < 1 << n; ++i) {
157+
for (int j = i; j; j = (j - 1) & i) {
158+
if (ok[j]) {
159+
f[i] = min(f[i], f[i ^ j] + 1);
160+
}
161+
}
162+
}
163+
return f[(1 << n) - 1];
164+
}
165+
};
166+
```
167+
168+
### **Go**
169+
170+
```go
171+
func minSessions(tasks []int, sessionTime int) int {
172+
n := len(tasks)
173+
ok := make([]bool, 1<<n)
174+
f := make([]int, 1<<n)
175+
for i := 1; i < 1<<n; i++ {
176+
t := 0
177+
f[i] = 1 << 30
178+
for j, x := range tasks {
179+
if i>>j&1 == 1 {
180+
t += x
181+
}
182+
}
183+
ok[i] = t <= sessionTime
184+
}
185+
for i := 1; i < 1<<n; i++ {
186+
for j := i; j > 0; j = (j - 1) & i {
187+
if ok[j] {
188+
f[i] = min(f[i], f[i^j]+1)
189+
}
190+
}
191+
}
192+
return f[1<<n-1]
193+
}
194+
195+
func min(a, b int) int {
196+
if a < b {
197+
return a
198+
}
199+
return b
200+
}
201+
```
80202

203+
### **TypeScript**
204+
205+
```ts
206+
function minSessions(tasks: number[], sessionTime: number): number {
207+
const n = tasks.length;
208+
const ok: boolean[] = new Array(1 << n).fill(false);
209+
for (let i = 1; i < 1 << n; ++i) {
210+
let t = 0;
211+
for (let j = 0; j < n; ++j) {
212+
if (((i >> j) & 1) === 1) {
213+
t += tasks[j];
214+
}
215+
}
216+
ok[i] = t <= sessionTime;
217+
}
218+
219+
const f: number[] = new Array(1 << n).fill(1 << 30);
220+
f[0] = 0;
221+
for (let i = 1; i < 1 << n; ++i) {
222+
for (let j = i; j > 0; j = (j - 1) & i) {
223+
if (ok[j]) {
224+
f[i] = Math.min(f[i], f[i ^ j] + 1);
225+
}
226+
}
227+
}
228+
return f[(1 << n) - 1];
229+
}
81230
```
82231

83232
### **...**

solution/1900-1999/1986.Minimum Number of Work Sessions to Finish the Tasks/README_EN.md

+138-1
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,150 @@
6464
### **Python3**
6565

6666
```python
67-
67+
class Solution:
68+
def minSessions(self, tasks: List[int], sessionTime: int) -> int:
69+
n = len(tasks)
70+
ok = [False] * (1 << n)
71+
for i in range(1, 1 << n):
72+
t = sum(tasks[j] for j in range(n) if i >> j & 1)
73+
ok[i] = t <= sessionTime
74+
f = [inf] * (1 << n)
75+
f[0] = 0
76+
for i in range(1, 1 << n):
77+
j = i
78+
while j:
79+
if ok[j]:
80+
f[i] = min(f[i], f[i ^ j] + 1)
81+
j = (j - 1) & i
82+
return f[-1]
6883
```
6984

7085
### **Java**
7186

7287
```java
88+
class Solution {
89+
public int minSessions(int[] tasks, int sessionTime) {
90+
int n = tasks.length;
91+
boolean[] ok = new boolean[1 << n];
92+
for (int i = 1; i < 1 << n; ++i) {
93+
int t = 0;
94+
for (int j = 0; j < n; ++j) {
95+
if ((i >> j & 1) == 1) {
96+
t += tasks[j];
97+
}
98+
}
99+
ok[i] = t <= sessionTime;
100+
}
101+
int[] f = new int[1 << n];
102+
Arrays.fill(f, 1 << 30);
103+
f[0] = 0;
104+
for (int i = 1; i < 1 << n; ++i) {
105+
for (int j = i; j > 0; j = (j - 1) & i) {
106+
if (ok[j]) {
107+
f[i] = Math.min(f[i], f[i ^ j] + 1);
108+
}
109+
}
110+
}
111+
return f[(1 << n) - 1];
112+
}
113+
}
114+
```
115+
116+
### **C++**
117+
118+
```cpp
119+
class Solution {
120+
public:
121+
int minSessions(vector<int>& tasks, int sessionTime) {
122+
int n = tasks.size();
123+
bool ok[1 << n];
124+
memset(ok, false, sizeof(ok));
125+
for (int i = 1; i < 1 << n; ++i) {
126+
int t = 0;
127+
for (int j = 0; j < n; ++j) {
128+
if (i >> j & 1) {
129+
t += tasks[j];
130+
}
131+
}
132+
ok[i] = t <= sessionTime;
133+
}
134+
int f[1 << n];
135+
memset(f, 0x3f, sizeof(f));
136+
f[0] = 0;
137+
for (int i = 1; i < 1 << n; ++i) {
138+
for (int j = i; j; j = (j - 1) & i) {
139+
if (ok[j]) {
140+
f[i] = min(f[i], f[i ^ j] + 1);
141+
}
142+
}
143+
}
144+
return f[(1 << n) - 1];
145+
}
146+
};
147+
```
148+
149+
### **Go**
150+
151+
```go
152+
func minSessions(tasks []int, sessionTime int) int {
153+
n := len(tasks)
154+
ok := make([]bool, 1<<n)
155+
f := make([]int, 1<<n)
156+
for i := 1; i < 1<<n; i++ {
157+
t := 0
158+
f[i] = 1 << 30
159+
for j, x := range tasks {
160+
if i>>j&1 == 1 {
161+
t += x
162+
}
163+
}
164+
ok[i] = t <= sessionTime
165+
}
166+
for i := 1; i < 1<<n; i++ {
167+
for j := i; j > 0; j = (j - 1) & i {
168+
if ok[j] {
169+
f[i] = min(f[i], f[i^j]+1)
170+
}
171+
}
172+
}
173+
return f[1<<n-1]
174+
}
175+
176+
func min(a, b int) int {
177+
if a < b {
178+
return a
179+
}
180+
return b
181+
}
182+
```
73183

184+
### **TypeScript**
185+
186+
```ts
187+
function minSessions(tasks: number[], sessionTime: number): number {
188+
const n = tasks.length;
189+
const ok: boolean[] = new Array(1 << n).fill(false);
190+
for (let i = 1; i < 1 << n; ++i) {
191+
let t = 0;
192+
for (let j = 0; j < n; ++j) {
193+
if (((i >> j) & 1) === 1) {
194+
t += tasks[j];
195+
}
196+
}
197+
ok[i] = t <= sessionTime;
198+
}
199+
200+
const f: number[] = new Array(1 << n).fill(1 << 30);
201+
f[0] = 0;
202+
for (let i = 1; i < 1 << n; ++i) {
203+
for (let j = i; j > 0; j = (j - 1) & i) {
204+
if (ok[j]) {
205+
f[i] = Math.min(f[i], f[i ^ j] + 1);
206+
}
207+
}
208+
}
209+
return f[(1 << n) - 1];
210+
}
74211
```
75212

76213
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public:
3+
int minSessions(vector<int>& tasks, int sessionTime) {
4+
int n = tasks.size();
5+
bool ok[1 << n];
6+
memset(ok, false, sizeof(ok));
7+
for (int i = 1; i < 1 << n; ++i) {
8+
int t = 0;
9+
for (int j = 0; j < n; ++j) {
10+
if (i >> j & 1) {
11+
t += tasks[j];
12+
}
13+
}
14+
ok[i] = t <= sessionTime;
15+
}
16+
int f[1 << n];
17+
memset(f, 0x3f, sizeof(f));
18+
f[0] = 0;
19+
for (int i = 1; i < 1 << n; ++i) {
20+
for (int j = i; j; j = (j - 1) & i) {
21+
if (ok[j]) {
22+
f[i] = min(f[i], f[i ^ j] + 1);
23+
}
24+
}
25+
}
26+
return f[(1 << n) - 1];
27+
}
28+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
func minSessions(tasks []int, sessionTime int) int {
2+
n := len(tasks)
3+
ok := make([]bool, 1<<n)
4+
f := make([]int, 1<<n)
5+
for i := 1; i < 1<<n; i++ {
6+
t := 0
7+
f[i] = 1 << 30
8+
for j, x := range tasks {
9+
if i>>j&1 == 1 {
10+
t += x
11+
}
12+
}
13+
ok[i] = t <= sessionTime
14+
}
15+
for i := 1; i < 1<<n; i++ {
16+
for j := i; j > 0; j = (j - 1) & i {
17+
if ok[j] {
18+
f[i] = min(f[i], f[i^j]+1)
19+
}
20+
}
21+
}
22+
return f[1<<n-1]
23+
}
24+
25+
func min(a, b int) int {
26+
if a < b {
27+
return a
28+
}
29+
return b
30+
}

0 commit comments

Comments
 (0)