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

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

在这里插入图片描述


在这里插入图片描述
把job分配给哪一个桶是没有区别的,分配给工人1、还是工人2,下面的循环还是再重复跑一遍!对题目的要求来说是没有区别的,题目是求最小的各排桶的最大值。
所以才:for (int i = 0; i < used; ++i)

   // if (u == 0) {
   //    System.out.println(bucket[1]);
   // }
   所以才输出为0

Java:
左分支一节节的延伸到左下角,然后再遍历最下面一层,再回到上一层进行遍历,再延伸到最下层遍历。
第一层used为0、第二层used为1、第3层used为2(第4层为3,):
因为第一个工作只能分配给1个人,第2个工作只能分配给前面的2个人的一个,第3个工作可以分配给3个人的一个,避免了分配情况的重复(第一个工作分配给A,还是B,后面的组合可能是一样的,所以这是组合,不是排列,258,528对结果而言是一类的!)

class Solution {
    private int ans = Integer.MAX_VALUE;

    public void dfs(int u, int[] bucket, int used, int k, int[] jobs){
        if (u == jobs.length){  // u是数组的下标,当数组的元素全部用完的时候就处理!
            int maxv = 0;
            for (int i = 0; i < k; ++i){
                maxv = Math.max(maxv, bucket[i]);
            }
            ans = Math.min(maxv, ans);   // 有多种组合,取各种组合形成的最大值列中的最小值
            return;
        }
        if (used < k) {  // 优先分配给下一个空闲桶
            bucket[used] = jobs[u];
            dfs(u + 1, bucket, used + 1, k, jobs);  // 桶0、桶1、桶2
            bucket[used] = 0;
        }  // 当k个桶都分配之后,再给这些桶重新放剩下的元素(剪枝、不然超时)
        for (int i = 0; i < used; ++i){  
            if(bucket[i] + jobs[u] >= ans) continue;
            bucket[i] += jobs[u];          
            dfs(u + 1, bucket, used, k, jobs);
            bucket[i] -= jobs[u];
        }
    }

    public int minimumTimeRequired(int[] jobs, int k) {
        dfs(0, new int[k], 0, k, jobs);
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值