class Solution:
def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
def backtrack(pos, workloads, limit):
if pos >= len(jobs): return True
for i in range(len(workloads)):
workload = workloads[i]
if jobs[pos] + workload <= limit:
workloads[i] += jobs[pos]
if backtrack(pos + 1, workloads, limit): return True
workloads[i] -= jobs[pos]
# 剪枝
if workload == 0:
return False
return False
def possible(limit):
return backtrack(0, [0] * k, limit)
# 剪枝
jobs.sort(reverse=True)
l, r = jobs[0], sum(jobs)
while l <= r:
mid = (l + r) // 2
if possible(mid):
r = mid - 1
else:
l = mid + 1
return l
class Solution {
public:
int minimumTimeRequired(vector<int>& jobs, int k) {
int n = jobs.size();
vector<int> sum(1 << n);
for (int i = 0; i < (1 << n); i++) {
for(int j = 0; j < n; j++) {
if (i & (1 << j)) {
sum[i] += jobs[j];
}
}
}
vector<vector<int>> dp(k, vector<int>(1 << n));
for (int i = 0; i < (1 << n); i++) {
dp[0][i] = sum[i];
}
for (int i = 1; i < k; i++) {
// 二进制子集枚举优化
for (int j = 0; j < (1 << n); j++) {
dp[i][j] = INT_MAX;
for (int x = j; x; x = (x - 1) & j) {
dp[i][j] = min(dp[i][j], max(dp[i - 1][j - x], sum[x]));
}
}
}
return dp[k - 1][(1 << n) - 1];
}
};
class Solution:
def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
n = len(jobs)
sum_jobs = [0] * (1 << n)
dp = [[float("inf") for _ in range(1 << n)] for _ in range(k)]
for i in range(1 << n):
for j in range(n):
if i & 1 << j:
sum_jobs[i] += jobs[j]
for i in range(1 << n):
dp[0][i] = sum_jobs[i]
for i in range(1, k):
# 二进制子集枚举优化
for j in range(1 << n):
sub = j
while sub != 0:
dp[i][j] = min(dp[i][j], max(dp[i - 1][j - sub], sum_jobs[sub]))
sub = j & (sub - 1)
return dp[-1][-1]