6.贪心算法

97 阅读1分钟
0.贪心算法策略

优先考虑最满足标准的样本,最后再考虑不满足标准的样本。即从局部最优的角度出发,而非整体最优(整体最优使用动态规划)

1.课程安排问题:课程之间时间段不能重合,安排尽可能最多的课程
// 优先考虑结束时间最早的课程
function f(courses) {
  // 结束时间从小到大排序
  courses = courses
    .map( item => ({startT: item[0], endT: item[1]}) )
    .sort((a, b) => a.endT - b.endT)

  let res = [courses.shift()]
  for (let i in courses) {
    if (courses[i].startT >= res[0].endT) {
      res.unshift(courses[i])
    }
  }
  return res.reverse()
}
2.切金条:[10,20,30]
function f(arr) {
  arr.sort((a, b) => a - b)
  let num = 0
  let cur = 0
  while (arr.length>1) {
    cur = arr.shift() + arr.shift()
    num += cur
    arr.push(cur)
    arr.sort((a,b)=>a-b)
  }
  return num
}
3.项目:启动资金w=4,项目花销costs[2,5,4,1,8],项目收益profits[3,6,7,2,10],可作项目数k=3
function f(k,w,profits,costs) {
  let minCostQ = []
  let maxProfitQ = []
  for (let i = 0; i < costs.length; i++){
    minCostQ.push({ c: costs[i], p: profits[i] })
  }
  minCostQ.sort((a, b) => a.c - b.c) // 小根堆
  
  for (let i = 0; i < k; i++){
    while (minCostQ.length && minCostQ[0].c <= w) {
      maxProfitQ.push(minCostQ.shift()) // 能作的项目
    }
    maxProfitQ.sort((a, b) => b.p - a.p) // 大根堆
    if (!maxProfitQ.length) return w
    w += maxProfitQ.shift().p
  }
  return w
}