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
}