优先分配工作量大的工作。感性地理解,如果要求将小石子和大石块放入玻璃瓶中,优先放入大石块更容易使得工作变得简单。
在搜索过程中,优先分配工作量小的工作会使得工作量大的工作更有可能最后无法被分配。
/** * @param {number[]} jobs * @param {number} k * @return {number} */ var minimumTimeRequired = function(jobs, k) { jobs.sort((a,b)=>b-a); let n = jobs.length; let l = jobs[0]; let r = 0; for(let i = 0;i<n;i++){ r+=jobs[i]; } while(l<r){ let mid = Math.floor((l+r)/2); if(check(jobs,k,mid)){ r=mid; }else{ l=mid+1; } } return l; }; function check(jobs,k,limit) { let works = new Array(k).fill(0); let n = jobs.length; const f = (w,i)=>{ if(i>=n){ return true; } let cur = jobs[i]; for(let j=0;j<k;j++){ if(w[j]+cur<=limit){ w[j]+=cur; if(f(w,i+1)) return true; w[j]-=cur; } if(w[j] === 0 || w[j]+cur === limit){ break; } } return false; } return f(works,0) }