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];
}
};
Python3 Code(超时):
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]