把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;
}
}