原题链接:1723. 完成所有工作的最短时间
solution:
dfs + 回溯 + 剪枝
①结束条件:任务分配完成,maxt保存所有工人的最大工作时长,再用maxt和以前的最大工作时长res进行比较,更新res。
②分配时间,深度优先搜索,先把所有任务优先分配给第一个人,回溯以后再往下一个人进行分配。
③剪枝条件1:如果当前分配的工人时长大于以前分配结束的最大工人时长,进行剪枝
④剪枝条件2:如果回溯后,工人工作时间workers[i] == 0,进行剪枝,因为该工人后面的工作时间全是0,没有意义。
class Solution {
public:
int res = INT_MAX;
int minimumTimeRequired(vector<int>& jobs, int k) {
vector<int> workers (k, 0); //定义每个工人的工作时长
dfs(workers, jobs, 0);
return res;
}
void dfs(vector<int> &workers,vector<int>& jobs,int index) {
if(index == jobs.size()) { //如果所有任务分配完毕,更新一次res
int maxt = -1;
for(int i = 0;i < workers.size();i++) { //任务分配完毕,保存最大工作时间
maxt = max(maxt, workers[i]);
}
res = min(res, maxt); //更新最小的最大工作时间
return;
}
for(int i = 0;i < workers.size();i++) { //分配时间
if(workers[i] + jobs[index] >= res) { //如果此次分配大于以前的最小的最大工作时间,剪枝
continue;
}
workers[i] += jobs[index];
dfs(workers,jobs,index + 1);
workers[i] -= jobs[index]; //回溯
if(workers[i] == 0) break; //剪枝
}
}
};