Leetcode: 1723. Find Minimum Time to Finish All Jobs

Problem Statement

from typing import List


class Solution:
    def minimumTimeRequired(self, jobs: List[int], K: int) -> int:
        N = len(jobs)
        jobs.sort(reverse=True)
        load = [0] * N
        ans = float("inf")

        def bt(i, cur):
            nonlocal ans
            if cur >= ans:
                return
            if i == N:
                ans = min(ans, cur)
                return
            for j in range(K):
                load[j] += jobs[i]
                if load[j] < ans:
                    bt(i + 1, max(cur, load[j]))
                load[j] -= jobs[i]
                if load[j] == 0:
                    break

        bt(0, 0)
        return ans


assert Solution().minimumTimeRequired([3, 2, 3], 3) == 3
assert Solution().minimumTimeRequired([1, 2, 4, 7, 8], 2) == 11
from typing import List


class Solution:
    def minimumTimeRequired(self, jobs: List[int], K: int) -> int:
        S = sum(jobs)
        N = len(jobs)
        M = 2**N

        cost = [0] * M
        for i in range(M):
            for j in range(N):
                if i & (1 << j):
                    cost[i] += jobs[j]

        def submasks(mask):
            submask = mask
            while submask:
                yield submask
                submask = (submask - 1) & mask

        dp = [[float("inf")] * M for _ in range(K + 1)]
        for k in range(K, -1, -1):
            if k == K:
                dp[k][M - 1] = 0
            else:
                for used in range(M):
                    allowed = (M - 1) ^ used
                    cur = float("inf")
                    for new in submasks(allowed):
                        if cost[new] < cur:
                            cur = min(cur, max(cost[new], dp[k + 1][used | new]))
                    dp[k][used] = cur
        return dp[0][0]


assert Solution().minimumTimeRequired([3, 2, 3], 3) == 3
assert Solution().minimumTimeRequired([1, 2, 4, 7, 8], 2) == 11