1723. 完成所有工作的最短时间

原题链接: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;  //剪枝
        }
    }
};

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值