# 2020q3 sysprog Homework8 (quiz8)
###### tags: `sysprog`
contributed by < `sciyen` >
[Toc]
## Q1 [LeetCode 1494. Parallel Courses II](https://leetcode.com/problems/parallel-courses-ii/)
```c=
#include <string.h>
#include <limits.h>
#define min(a, b) (((a) < (b)) ? (a) : (b))
static void solve(int i, int s, int k, int n, int s0, int s1, int *dp)
{
if ((k == 0) || (i == n)) {
dp[s0 | s] = min(dp[s0 | s], dp[s0] + 1);
return;
}
solve(i + 1, s, k, n, s0, s1, dp);
if ((s1 >> i) & 1)
solve(i + 1, s | 1 << i, k - 1, n, s0, s1, dp);
}
int minNumberOfSemesters(int n,
int **dependencies,
int dependenciesSize, // Number of dependencies
int *dependenciesColSize,
int k)
{
// Use each bit to represent classes, so the size is 2^n
// Create a map that indicate class `index`'s dependencies in the form of bits
const size_t cap = 1 << n;
int pre[cap];
// Reset all array element to 0
memset(pre, 0, sizeof(pre));
for (int i = 0; i < dependenciesSize; i++)
// Because class id start from 1, so we add `-1` while indexing
// `|=` set `i` class's all dependencies to 1
pre[dependencies[i][1] - 1] |= 1 << (dependencies[i][0] - 1);
// Initialize the map that restore the minimal answer of each class
int dp[cap];
for (int i = 1; i < cap; i++)
dp[i] = INT_MAX;
dp[0] = 0;
for (int s0 = 0; s0 < cap; s0++) {
if (dp[s0] == INT_MAX)
continue;
int s1 = 0;
for (int i = 0; i < n; i++)
if (!((s0 >> i) & 1) && ((pre[i] & s0) == pre[i]))
s1 |= 1 << i;
solve(0, 0, k, n, s0, s1, dp);
}
return dp[cap - 1];
}
```